質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Q&A

解決済

3回答

1612閲覧

grepコマンドの正規表現

strike1217

総合スコア651

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

0グッド

0クリップ

投稿2017/08/13 04:09

編集2017/08/13 04:10

例えば、ptrace(){ の文字列にマッチした行を検索した時に、どのように正規表現を記述すれば良いでしょうか?

()の中の文字列は任意です。

grep -E -Hr -nw --binary-files=without-match 'ptrace(.+){' ./kernel/
./kernel/fork.c:840: !ptrace_may_access(task, mode)) { ./kernel/kcmp.c:126: !ptrace_may_access(task2, PTRACE_MODE_READ_REALCREDS)) { ./kernel/ptrace.c:183: if (child->ptrace && child->parent == current) { ./kernel/ptrace.c:277: !ptrace_has_cap(__task_cred(task)->user_ns, mode)) { ./kernel/ptrace.c:415: if (!current->ptrace) { ./kernel/ptrace.c:521: list_for_each_entry_safe(p, n, &tracer->ptraced, ptrace_entry) { ./kernel/ptrace.c:1075:#define arch_ptrace_attach(child) do { } while (0) ./kernel/exit.c:600: if (unlikely(tsk->ptrace)) { ./kernel/exit.c:622: list_for_each_entry_safe(p, n, &dead, ptrace_entry) { ./kernel/exit.c:1133: if (ptrace) { ./kernel/exit.c:1342: if (likely(!ptrace) && unlikely(p->ptrace)) { ./kernel/exit.c:1444: list_for_each_entry(p, &tsk->ptraced, ptrace_entry) { ./kernel/signal.c:914: (sig == SIGKILL || !t->ptrace)) { ./kernel/signal.c:1684: if (for_ptracer) { ./kernel/signal.c:1783: if (arch_ptrace_stop_needed(exit_code, info)) { ./kernel/signal.c:1834: if (may_ptrace_stop()) { ./kernel/signal.c:2006: if (likely(!current->ptrace)) { ./kernel/signal.c:2068: if (current->ptrace & PT_SEIZED) { ./kernel/signal.c:2205: if (unlikely(current->ptrace) && signr != SIGKILL) { ./kernel/seccomp.c:686: if (!ptrace_event_enabled(current, PTRACE_EVENT_SECCOMP)) {

()の中身は任意の文字列で、ptrace(){ の文字列にマッチする正規表現です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

まず、grepで使える正規表現にはいくつかの種類があります。+?などを使えるので、grep -Eで呼び出す拡張正規表現をおすすめします(以下、それを前提に解説します)。

'ptrace(.+){'とすると、拡張正規表現では(){が特殊文字なので、それぞれ\でエスケープする必要があります。

投稿2017/08/13 09:14

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

題意は、

ptrace(

で始まり、任意の文字列を挟み

){

で終わる文字列にマッチさせたいと読み取れます。その場合、

ptrace(.*){

だと思いますが、そういう意図でないなら、どういう文字列をマッチさせたいのかもう少し明快に説明してほしいと思います。

コメントを受けて追記:
再現しません。
以下のようなtest.txtを作り

&ptracer_relations, node) {

if (child->ptrace && child->parent == current) {
ptrace(111){
ptrace(){

grep実行。

sh

1$ grep 'ptrace(.*){' test.txt 2ptrace(111){ 3ptrace(){ 4

もしかしたらgrepのバージョンが違うのではないでしょうか。たとえば実はegrepを使っているとか。egrepとgrepではサポートする拡張表現が違います。egrepではカッコはメタ文字になりますがgrepではただの文字です。

投稿2017/08/13 06:36

編集2017/08/13 09:10
KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2017/08/13 06:41

「+」ではダメなのでしょうか??
KojiDoi

2017/08/13 07:48

カッコの中がカラであるパターンを許容するかどうかによります。
strike1217

2017/08/13 08:50

&ptracer_relations, node) { if (child->ptrace && child->parent == current) { 全く関係のない上記のようなものまでヒットしていまします。 どうすればよいのでしょう?
maisumakun

2017/08/13 09:16

もとのコードでもgrep -Eとしているので、拡張正規表現で動いています。
strike1217

2017/08/13 09:23

ああ~~。できました。 拡張正規表現の場合は() も {}もエスケープしないといけないんですね。 普通の正規表現の場合は、kojiDoiさんの大丈夫でしたが・・・ 'ptrace(.*){’ だと何もヒットしませんでした。 'ptrace(.*)’  こちらだとヒットしますね。
strike1217

2017/08/13 09:24

おっと! スペースの入れ忘れでした。すいません。 大丈夫です!!
guest

0

ptrace(.+){

この正規表現には問題があります。

量指定子 + のエスケープ

量指定子 + はエスケープしないと + という文字にマッチしてしまいます。

ptrace(.\+){

無意味な中カッコ閉じ

マッチしたい行が { で終わっているとは限りません。

ptrace(.\+)

ptrace が部分一致になっている

uptrace という関数にもマッチし得ます。

\bptrace(.\+)

Any match . は閉じカッコにもマッチし得る

ここは手法が何個かあります。

  • . の代わりに [^)] を使う
  • 最短マッチ .*? を使う

せっかくなので前者を使ってみましょう。

\bptrace([^)]\+)

ですので実行するコマンドは

grep -E -Hr -nw --binary-files=without-match '\bptrace([^)]\+)' ./kernel/

になるべきかと思います。もちろん、これでも補えない物もあります。例えば ptrace の後に空白が入る物もありますし、閉じカッコが改行後に現れる物もあります。

ptrace( ... );

どの様なケースがあるかどうかは分かりません。

投稿2017/08/13 04:37

mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2017/08/13 06:04

+は繰り返すの正規表現ですよね? これエスケープするんですか?
mattn

2017/08/13 11:14

既に BA 出てるので解説不要ですね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問