web-dev-qa-db-ja.com

Grepディレクトリ内のすべてのファイルでstring1 AND string2を検索します

Cygwinでgrepを使用して[〜#〜] both [〜#〜]単語を含むすべてのファイルを検索するにはどうすればよいですか。

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

grep -r "db-connect.php" .

上記を拡張して、「db-connect.php」と「version」の両方を含むファイルを探すにはどうすればよいですか。

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

助けてくれてありがとう

19
Abs
grep -r db-connect.php . | grep version
21
marcog

異なる行を持つファイル内のいくつかの文字列をgrepする場合は、次のコマンドを使用します。

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

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

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

4
Coroos

grep "db-connect.php" * |カット-d:-f1 | xargs grep "バージョン"

私は再帰モードでは試しませんでしたが、同じになるはずです。

3
jzrk

私のcygwinでは、与えられた回答は機能しませんでしたが、以下は機能しました:

grep -l firststring `grep -r -l secondstring . `
3
incircuitous

複数の検索をまとめてandするには、複数の先読みアサーションを使用します。

書く代わりに

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の3つすべてと行を一致させたいと想像してください。butにはXまたはYが含まれていません。必要なのはこれだけです:

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

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

そこは、かなりクールではないですか?

3
tchrist

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

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

同じ行の「string1」と「string2」を意味しますか?

grep 'string1.*string2'

同じ行にありますが、順序は不定ですか?

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

または、両方の文字列がファイルのどこかに出現する必要がありますか?

grep -e string1 -e string2
1
glenn jackman

Grepのみに固執する理由:

Perl -lne 'print if(/db-connect.php/&/version/)' *
0
Vijay