見つかった単語と文字列を含むすべてのファイル名を一覧表示する egrep コマンドが必要です。次のシナリオを想像してみましょう。
見つける必要のある単語: apple
、watermelon
および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
指示します。)grep
egrep
答え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