2010-11-25 2 views
18

BOTHという単語を含むすべてのファイルをcygwinで検索するにはどうすればよいですか。Grepディレクトリのすべてのファイルをstring1とstring2で検索します。

これは、私は1つの単語を再帰的にディレクトリ内のすべてのファイルを検索するために使用するものである:「

grep -r "db-connect.php" . 

は、どのように私は両方の「DB-connect.php」を含むファイルを検索するには、上記を拡張することができ、バージョン"。

私はこれを試しました:grep -r "db-connect.php\|version" .これはORです。つまり、どちらか一方を含むファイルを取得します。すべての任意のヘルプ

+0

。 1つは1つの単語のためのもので、もう1つは一致したファイルの共通部分を見つける。それは些細なことではありませんが、より良い方法があるかどうかわかりません。 –

答えて

20
grep -r db-connect.php . | grep version 
+0

華麗な、ありがとう。返されたファイルは、私が期待したよりも少ないようです。調査中... – Abs

+0

うん、うまくいく! – Abs

+11

これは、両方がファイル内にあるが、異なる行にある場合には間違っていませんか? – lathomas64

3

grepの "DB-connect.php" の

感謝* |カット-d:-f1 | xargs grep "version"

私は再帰モードで試しませんでしたが、同じでなければなりません。

+0

これは、両方の文字列が入っているファイルを返しません。どちらか一方の文字列を返します。右? – Abs

+1

さて、いいえ、2つの文字列を含むすべてのファイルを返すべきです(文字列が異なる行にあるとします)。試してみてください:grep "db-connect.php" * |カット-d:-f1 | xargs grep "version" | cut -f1 -d:ファイル名のみを指定する... – jzrk

+0

最後のコマンドは便利です。確認が必要なファイルを確認するのに役立ちました。ありがとう。 +1。 – Abs

1

"string1"と "string2"は同じ行にありますか?

grep 'string1.*string2' 

不一致の順序で同じ行にありますか?

grep '(string1.*string2)|(string2.*string1)' 

または両方の文字列がファイル内のどこにでも表示される必要がありますか?

grep -e string1 -e string2 
+1

最後のものは 'grep 'と同じですstring1 \ | string2 ANDではないORである。 –

1

はザは、複数行のマッチングとPCRE(Perl互換正規表現)を使用し、両方の文字列(ANDなくOR)を含むファイルのファイル名を返します。

grep -Plr '(?m)db-connect\.php(.*\n)*version|version(.*\n)*db-connect\.php' . 
3

一緒andに複数の検索、複数の先読みアサーションを使用し、事ごとに、最後の1から離れて探した:

代わりの

grep -P A * | grep B 

を書いて、あなたが

grep -P '(?=.*A)B' * 

grep -Pr '(?=.*db-connect\.php)version' . 
を書きます

書き込みしないでください

grep -P 'A.*B|B.*A' * 

これはオーバーラップに失敗しますが、(?=…)(?=…)の手法では失敗するためです。

また、NOTの演算子を追加することもできます。 Xと一致しない行を検索するには、もちろんコマンドラインで-vを使用します。しかし、それが大きなパターンの一部であれば、それを行うことはできません。そうである場合は、パターンに(?=(?!X).)*$)を追加して、Xを含むものを除外します。

A、B、C、Dのいずれかの行に、しかしにXまたはYが含まれていないとします。必要なのは次のとおりです。

grep -P '(?=^.*A)(?=^.*B)(?=^(?:(?!X).)*$)(?=^(?:(?!Y).)*$)C|D' * 

一部のシェルおよび一部の設定では、それがあなたの履歴置換文字であれば、!をエスケープする必要があります。

そんなに涼しいですね?私は与えられた答えをcygwinので

3

は動作しませんでしたが、以下ではなかった:

grep -l firststring `grep -r -l secondstring . ` 
4

あなたは別のラインを持っているファイルで、複数の文字列をgrepしたい場合は、次のコマンドを使用します。

grep -rl expr1 | xargs grep -l expr2 | xargs grep -l expr3 

これにより、expr1、expr2、およびexpr3を含むファイルのリストが表示されます。

ディレクトリ内のファイル名に空白が含まれていると、これらのファイルでエラーが発生することに注意してください。これは、-0をgrepとxargsに加えることで修正できます。

なぜ唯一のgrepに固執する
+0

ヌルデリミタを使用して、空白文字を含むファイル名を処理するには、 'grep -rl -Z expr1 | xargs -0 grep -l -Z expr2 | xargs -0 grep -Z -l expr3'を実行します。 –

0

:あなたはちょうど2つのgrepする操作を行うことができ

perl -lne 'print if(/db-connect.php/&/version/)' * 
関連する問題