見つかったファイル名と文字列を表示するGrep

見つかったファイル名と文字列を表示するGrep

見つかった単語と文字列を含むすべてのファイル名を一覧表示する egrep コマンドが必要です。次のシナリオを想像してみましょう。

見つける必要のある単語: applewatermelonおよびbanana

必要なこと: これらのいずれかを含むすべてのファイルをリストし (すべてが同じファイルにある必要はありません)、ファイル内で見つかった単語を出力します。必要な検索結果の例:

./file1.txt:apple
./file1.txt:banana
./file2.txt:watermelon
./file5.txt:apple

grep検索結果に表示されるコマンドを見た記憶はありますFILENAME:STRINGが、どのように実行したかは思い出せません。試したのは次のことです:

egrep -lr 'apple|banana|watermelon' .

しかし、検索結果には次のものが表示されました。

./file1.txt
./file2.txt

はい、役に立ちますが... ではfile1、どの単語が見つかったのでしょうか? それが私が直面している問題です。

答え1

を使用しましたが-l、これはあなたが望むものとは逆です。man grep:

-l, --files-with-matches
      Suppress normal output; instead print the  name  of  each  input
      file  from  which  output would normally have been printed.  The
      scanning will stop on the first  match.   (-l  is  specified  by
      POSIX.)

あなたが望むものは次のとおりです-H:

-H, --with-filename
      Print the file name for each match.  This is  the  default  when
      there is more than one file to search.

しかし、それはデフォルトです。次のようにするだけです:

grep -Er 'apple|banana|watermelon' .

(は のように行動するように-E指示します。)grepegrep

答え2

awk でそれを実行する方法:

awk -v var1=apple -v var2=banana -v var3=watermelon '{ if($0~var1) {print FILENAME":"var1} ; if($0~var2) {print FILENAME":"var2} ; if($0~var3) {print FILENAME":"var3}  }' *

基本的に、3つの変数を宣言し、ファイル名と見つかった対応する変数を出力する3つのif文を宣言します。

編集

短縮版:

awk '/watermelon/{ print FILENAME":watermelon" }; /banana/{print FILENAME":banana"}; /apple/ {print FILENAME":apple"}' *

基本的な考え方は、/regular expression/見つかった場合はその後の中括弧内のコードを検索して実行することです (これは、FILENAME と見つかった文字列を印刷することです)。

答え3

探しているコマンドは次のとおりです。

grep -R "apple\|banana\|watermelon" <search_path>

-Rは各ディレクトリの下にあるすべてのファイルを読み取ります。検索パス、再帰的に検索します。一致するごとにファイル名が表示されます。

答え4

次のようにすると、必要な出力が得られます (bash を使用)。

for x in apple banana watermelon ; do grep $x * ; done

出力には、検索文字列を含むすべての行が表示されます。

次のようにすると、検索文字列のみが出力されます。

for x in apple banana watermelon ; do grep -l $x * |xargs -I{} echo {}:$x; done

関連情報