特定の単語を含むすべてのファイルを見つけて、行数を数えます。

特定の単語を含むすべてのファイルを見つけて、行数を数えます。

特定の単語を含むすべてのファイルを再帰的に検索し、その単語がファイルに存在する場合は、ファイルの行数を調べる必要があります。私はこれを使用しようとしましたが、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_と一致します。参考用。

関連情報