特定の単語を含むすべてのファイルを再帰的に検索し、その単語がファイルに存在する場合は、ファイルの行数を調べる必要があります。私はこれを使用しようとしましたが、grep
これまで成功していませんでした。
答え1
grep -Zlr "\<THE_WORD\>" * | xargs -0 wc -l
grep オプション:
-Z
- 印刷されたファイル名を0/nullバイトで終了して区切ります(異常なファイル名や空白のあるファイル名に役立ちます)-l
- 一致する行の代わりにファイル名を一覧表示-r
- 再帰的-i
- 大文字と小文字を無視する(オプションですが、すべてのバリアントを見つけるのに役立ちます)
引用符の周囲には、「WHICH」内に「HI」が見つからないようにする「単語区切り記号」(および)をTHE_WORD
使用しました。便利です。\<
\>
"THE_WORD" を含む 0 で区切られたファイル名のリストを にパイプしxargs
、 0 バイト区切り記号を予想するよう指示し ( -0
)、実行wc
(単語数)、行数表示 ( -l
)
編集する:
コメントの質問に答えるには、次のバリエーションを試してください。 (調査をしてみました!)
grep -oi "\<THE_WORD\>" /dev/null * | sort | uniq -c
そして説明:
-o
行内のすべての項目を印刷することを意味します。したがって、「blah blah THE_WORD blah THE_WORD blah blah」がある場合はその行に対して2回印刷し、このフラグがない場合はgrepはその行に対して1回だけ印刷します。-i
大文字と小文字のバリエーション(例:The_Word、the_wordなど)\<
単語の先頭にする必要があるため、「WHICH」で「HI」を見つけることができません。- `>'は単語で終わらなければならず、 'WHICH'で 'HI'を見つけることができないようにしなければなりません。
/dev/null
単一のファイルのみを検索しても、grepに常にファイル名を出力させるダミーファイル名。これはgrepオプションを使って強制することができますが、「よく知られていない魔法」で評価できる-H
ほど簡単で説明が多いことがわかりました。-H
パイプラインを介してすべてをソートします(ア...ソート...)。
ソートされたリストをuniqにパイプし、ソートされたリスト内の
-c
各項目の数を数えます。
そして乗る! !
一例:
File example.c contains:
(*H)->segments=realloc((*H)->segments,sizeof(segment_t*)*((*H)->segment_count+1));
xenon-lornix:~/projects/emma> grep -oi "\<H\>" /dev/null *.c | sort | uniq -c
3 example.c:H
したがって、カウントリストを返します(サム)、どこ(example.c)、そして何(時間)! !望むより!はい!
同じファイル内容を持つ別のファイル:
xenon-lornix:~/projects/emma> grep -oi "\<segments\>" /dev/null example.c | sort | uniq -c
2 aa.c:segments
ここに見られるように、2つが見つかりました。部分、しかし計算されない部分。\<
&\>
フルワードのみを一致させるように強制します。 THE_WORD123
するいいえ単語が英数字以外の文字の場合は_THE_WORD_と一致します。参考用。