word1
たとえば、2つの単語と(たとえば)を含むディレクトリツリーですべてのテキストファイルを検索したいとしますword2
。 2つの単語が連続して現れる場合にのみ見つけることができるので、grep
それはできません。word1 word2
以下を含むすべてのファイルを検索したいと思います。両方これら2つの単語が必ずしも連続しているわけではありません。
理想的には、検索時にファイル名とファイルにその用語が見つかったコンテキストを印刷する必要があります。これが役に立ちます。 GUIは病気ではありません。
どうすればいいですか?
答え1
find
ファイルが一致すると見なされるには、すべてのテストに合格する必要がある関数を使用します。grep
条件に一致するように2つのコマンドを一緒にリンクします。
find . -type f -exec grep -q word_one {} \; -exec grep -l word_two {} \;
シェル特殊文字や正規表現特殊文字がある場合は、単語を引用(または使用)するなど、必要に応じてgrepのフラグを調整できますgrep -F
。
答え2
2つの異なる単語が存在するファイルを検索する方法は? 基本的な問題に対する良い解決策がたくさんあります。コンテキストを表示する必要がある追加の要件を満たすには、次のいずれかの回答を選択します。スティーブン)と少し追加してください:
find . -type f -exec grep -q word1 {} ';' -exec grep -q word2 {} ';' \
-exec grep -A3 -B3 -E -H 'word1|word2' {} +
このfind . -type f -exec grep -q word1 {} ';' -exec grep -q word2 {} ';'
部分はStéphaneの2番目の答え(移植可能ですが簡単な答え)です。ここで、-l
2番目のオプション(ファイル名のリスト)は(状態で自動的に検索および終了)grep
に置き換えられます。-q
次に、最終結果を追加してgrep
結果を表示します。各ゲームの終わりには3行が-A3
表示され、-B3
以前は3行が表示されます。-E
拡張正規表現;word1|word2
なしで動作するように\
してください。ファイルが1つしかない場合でも、-H
ファイル名は強制的に印刷されます。grep
答え3
あなたはこれを行いますgrep
:
grep -Elrz "word2(.|\n)*word1|word1(.|\n)*word2" .
出力の内容を一致させる必要がある場合は、上記のl
オプションを削除してください。
答え4
私の最初の考えは、最初に埋め込まれたファイルを検索してから、word1
その中に含まれるファイルを検索することword2
です。
grep -l word1 -r . | xargs grep -l word2
例:
$ cat FILE
word1
$ cat FILE1
word2
$ cat FILE2
word1
word2
$ grep -l word1 -r . | xargs grep -l word2
FILE2
GNU
ユーザー領域でFreeBSD
テストされました。