この質問にはすでに回答があります:
コメント
回答
GNU grep
2番目の
は、少し速くなるはずです。 div id = “f3c694a167″>
はファイルのリストを操作できます。
grep -lZ "foo" * | xargs -0 grep -l "321"
POSIX grep with find
find
は、再帰的なディレクトリを検索する場合に便利です(その場合、-mindepth
と-maxdepth
オプション。
find . -mindepth 1 -maxdepth 1 -type f -exec grep -q "foo" {} \; -exec grep -l "321" {} +
コメント
回答
でPOSIX行を使用する代わりに、
これは短いスクリプトで実行できます:
for FILE in * do grep -q foo $FILE && grep -q 321 $FILE && echo $FILE done
これは1行で実行することもできます:
for FILE in *; do grep -q foo $FILE && grep -q 321 $FILE && echo $FILE; done
grep
は、文字列が見つかった場合は0(true)を返し、コマンドを区切る&&
は、 2番目のものは、最初のものがtrueの場合にのみ実行されます。 -q
オプションは、grep
が何も出力しないようにします。
エコーは、両方の文字列が同じファイルで見つかりました。
別の方法を考えました。この方法は、問題のファイルがインストールされているRAMよりも大きい場合、各ファイルを1回だけgrep
通過する必要があるため、おそらくより効率的です。
for FILE in * do test $(egrep -o "foo|321" $FILE | uniq | sort | uniq | wc -l) -eq 2 && echo $FILE done
および1行バージョン:
for FILE in *; do test $(egrep -o "foo|321" $FILE | uniq | sort | uniq | wc -l) -eq 2 && echo $FILE; done
コメント
回答ではないのはなぜだろうと思います
奇妙です。私の場合、両方のバリアントが機能します(grep(GNU grep)2.13):
grep "foo\|321" grep -E "foo|321"
編集1 -両方が一致するファイルのみを表示する
for file in *
の回答は機能しますが、パフォーマンスの悪夢になる可能性があります(大量のファイルの場合) ):ファイルごとに少なくとも2つのプロセス。これは(GNUの世界では)高速です:
find . -type f -print0 | xargs -0 -r grep --files-with-matches --null -- string1 | xargs -0 -r grep --files-with-matches -- string2
string1は、一致数が少なくなるものでなければなりません。
コメント
回答
基本的に、特定のファイルを含むすべてのファイルを検索しますディレクトリ内の文字列の場合、次を使用できます:
grep -lir "pattern" /path/to/the/dir
-
-l
:このスキャンを行う最初の一致で停止します
-
-i
:パターンと入力ファイルの両方で大文字と小文字の区別を無視します
-
-r
:ディレクトリ内のすべてのファイルを再帰的に検索します
2つのパターンを検索するには、次の方法を試してください:
grep -lr "321" $(grep -lr "foo" /path/to/the/dir)
コメント
回答
必要
grep -e "foo" -e "321" *
複数のパターンに-eを使用
編集
両方を一致させる必要がある場合:
grep -e ".*foo.*321.*" *
順序が重要でない場合:
grep -e ".*foo.*321.*" ".*321.*foo.*" *
コメント