findとgrepを1行に使用できますか?

findとgrepを1行に使用できますか?

イベントベースのディレクトリ構造があります。

これらのイベントには、検索する必要があるパターンが含まれているか含まれていないファイルタイプがあります。肯定的な結果を別のファイルに保存したいと思います。

私の最初のアプローチは次のとおりです。

find . /EVENT*/'filename' | grep 'searchtext' head -2 > error_file

しかし、これはうまくいかないようです。この方法では合わせることができないというのにfindどうgrepすればいいですか?

答え1

これは一般的なパターンです:

find /directory/containing/files -type f -exec grep -H 'pattern_to_search' {} +

ここでは、find必要なファイルを含むディレクトリ内のすべてのファイルが最初に検索されます。この場合、コマンドは*.txt次のようになります。.txt

find /directory/containing/files -type f -name "*.txt" -exec grep -H 'pattern_to_search' {} +

-exec grep -H 'pattern_to_search' {} +必要なファイルを見つけたら-H(パターンが見つかったファイル名を印刷します)を使用して、このファイルから必要なパターンを検索します。ここでは{}検索したいファイルが含まれていると考えることができます+-exec-execgrepgrep -H 'pattern_to_search' file_1.txt file_2.txt file_3.txt

答え2

別の効果的なアプローチは次のとおりです。

 find /directory/containing/files -type f -print0 | xargs -0 grep "test to search"

print0 /オプション-0は、ファイル名文字列にスペースなどの特殊文字が含まれている場合を受け入れます。

答え3

1つのプロセスのみを使用する方法もあります(find、、-execを除くxargs)。

grep -r "test to search" /directory/containing/files

とにかくGNU grepを使用してください。 :)

ETA:オプションを表示するように求められたので、grep --include以下はheemaylの例と似ています(「* .txtなどのワイルドカードを使用して.txtで終わるファイルのみを見つけることができます」)。

grep --include '*.txt*' -r "pattern to search" /directory/containing/files

編集するときはい。これは直接代替ではなく代替です。このコマンドは、シンボリックリンクを介して(一般)ファイルを読み込みます。 (しかしシンボリックリンクディレクトリを介して再帰するわけではありません。そうする必要があります-R。)また、ソケット、名前付きパイプ、およびデバイスファイルも読み込みます(もちろん-D skip追加またはスキップすることはできますが)。そして、このようなオプションの効果を得る方法はありませんgrep。必要な場合 - 使用しないと良い選択だと思います。find-mtime -2findgrep

答え4

特定のパターンを見つけるためにテキストファイルをgrepし、サブディレクトリを繰り返す必要があるとします。 GNU grepを使うととても簡単です。

cd /to/the/top/level    
grep -r "PatternToSearch" *

-r-R代わりにまたはを使用できます。--recursive

検索パターンにスペースが含まれている場合は、引用符を使用する必要があります。

GNU grepには多くのオプションがあります。ただ入力grep --helpすると驚くでしょう!

関連情報