ディレクトリ内の複数のファイルから複数の文字列を検索し、見つかった文字列とそのファイル名を印刷します。

ディレクトリ内の複数のファイルから複数の文字列を検索し、見つかった文字列とそのファイル名を印刷します。

私は約500個の文字列を持っていて、その文字列を含むファイルをディレクトリから検索し、この文字列を含むファイル名を取得したいと思います。これまで私は次のものを使用しました。

find -name 'LYFNRE.*' -exec grep -f file1.txt {} \; -print

しかし、問題は、1つの文字列が複数のファイルで見つかる可能性があるため、出力が大きいため、どの文字列があり、どの文字列が欠落しているかを見つけるのが難しいということです。文字列を印刷してそのファイル名を見つけるのに役立ちますか?

答え1

grepファイル名だけを教えてください。 GNUはgrepこれを行うことができます:

grep -HFf ../strings.txt *

これにより、次の出力が提供されます。

[filename]:[matched_line]

...ディレクトリ内のすべてのファイルのすべてのエントリ。次のように行番号を取得することもできます。

grep -HnFf ../strings.txt *

...これは...

[filename]:[line_number]:[matched_line]

答え2

問題は、一度に1つのファイルを渡すことですgrepgrepコマンドラインに単一のファイルが表示された場合は、検索する場所を正確に知っていると想定されるため、一致の前にファイル名が表示されません。

ファイル名を常に出力する1つの方法grepはパスすることです/dev/null(一致するものはまったくありません)。一部のgrep実装には次のオプションがあります-H

また、一度に複数のファイルを実行する-exec … {} +代わりにプログラムを使用できます。-exec … {} \;これはより速いです。渡す必要があります。または、一致するファイルが1つしかない場合、または複数の呼び出しが/dev/null必要な一致が多く、そのうちの1つが単一のファイルに関連付けられているため、コマンドが1つのファイルでのみ呼び出される場合があります。-Hgrep

find -name 'LYFNRE.*' -exec grep -f file1.txt /dev/null {} +

GNU grepと最新のBSD実装(OSXを含む)grepfind

grep -R --include='LYFNRE.*' -f file1.txt -H .

または、シェルで再帰ワイルドカードを実行できます。 zshではすぐに使用できます。 Bashでは最初に実行する必要がありshopt -s globstar、bashはディレクトリへのシンボリックリンク(findまたはzshとは異なり)を介して繰り返されることに注意してください。

grep -f file1.txt /dev/null **/LYFNRE.*

答え3

egrepを使用してください:

egrep -n "str1|str2|str3" file_names

-nは、文字列が見つかった特定のファイルの行番号を印刷します。

関連情報