単一検索コマンドで複数のgrepを実行する

単一検索コマンドで複数のgrepを実行する

findコマンドを使用して、複数のパターンを含むいくつかのファイルを同時に検索したいと思います。

私は次のことを試しました:

find . -name "*.xml" -exec grep -iH keyword1 + && grep -iH "keyword2" {} \;

ただし、上記のコマンドは機能しません。

Bashで実装できますか?

答え1

私が理解したのは、以下を含むリストをリストしたいと思います。両方「キーワード1」と「キーワード2」。これには、-exec次の2つのテストを使用できます。

find . -name "*.xml" -exec grep -iq keyword1 {} \; -exec grep -iH keyword2 {} \;

grep最初の項目がtrueを返すと、条件付きで2番目の項目が実行されます。このオプションは "keyword1"のみを含むすべてのファイルを一覧表示し、-q最初の出力の出力をブロックします。grep

この-Hオプションはファイル名と一致する行を出力するため、これを使用することをお勧めします-l。だから

find . -name "*.xml" -exec grep -iq keyword1 {} \; -exec grep -il keyword2 {} \;

これにより、Calebの提案に似た出力が生成されますが、追加されます-print

答え2

まず、findでこれを行うには、2番目のパラメータを追加する必要があります-exec。パラメータごとに1つのコマンドしか実行できません。複数の命令を実行する必要がある場合は、1つの命令をシェルに設定し、複数の命令を実行するようにハッキングする必要があります。これfindは次のようになります。

find . -name "*.xml" -exec grep -qi "keyword1" {} \; -exec grep -qi "keyword2" {} \; -print

-printgrepが実行するのではなく、ファイル名を出力するためにfindオプションを使用しており、-qgrepオプションを使用して自動モードに設定してfindが結果であるかどうかを示すために使用できる戻りコードを提供します。真か偽かを確認して続行してください。最後のステップに達すると(両方のファイルが一致することを意味します)、出力が印刷されます。

ただし、grepは実際にはすべてのファイルを2回スキャンする必要があるため、これは非効率的です。質問が文字通りであればこれを行う必要がありますが、文字列を含むファイルを見つけるには、次のようにgrepを使用して一度に両方のパターンを検索できます。

find . -name "*.xml" -exec grep -qi -e "keyword1" -e "keyword2" {} \; -print

編集する:あなたの質問は正確に何をしたいのか明確ではありません。 1つ目は両方のキーワードを含むファイルのみを印刷するAND操作、2つ目は2つの文字列のいずれかが含まれている場合にファイル名を印刷するOR操作です。毒を選択してください。

答え3

または単にegrepを使用してください:

find . -name "*.xml" -exec egrep -iH "keyword1|keyword2" {} \;

関連情報