Grep Поиск всех файлов в каталоге для строки1 И строки2 - PullRequest
19 голосов
/ 25 ноября 2010

Как я могу использовать grep в cygwin, чтобы найти все файлы, содержащие ОБА слов.

Это то, что я использую для рекурсивного поиска всех файлов в каталоге по одному слову:

grep -r "db-connect.php" .

Как можно расширить вышеперечисленное, чтобы искать файлы, содержащие как "db-connect.php", так и "версию".

Я пробовал это: grep -r "db-connect.php\|version" ., но это ИЛИ, т. Е. Он получает файл, содержащий один или другой.

Спасибо всем за помощь

Ответы [ 8 ]

21 голосов
/ 25 ноября 2010
grep -r db-connect.php . | grep version
4 голосов
/ 01 августа 2013

Если вы хотите выполнить поиск для нескольких строк в файле с разными строками, используйте следующую команду:

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

Это даст вам список файлов, содержащих expr1, expr2 и expr3.

Обратите внимание, что если любое из имен файлов в каталоге содержит пробелы, эти файлы будут выдавать ошибки.Это можно исправить, добавив -0, я думаю, к grep и xargs.

3 голосов
/ 01 августа 2013

В моем cygwin данные ответы не сработали, но сработали следующие:

grep -l firststring `grep -r -l secondstring . `
3 голосов
/ 26 ноября 2010

Для 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, , но , в которых нет X или Y. Все, что вам нужно, это:

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

В некоторых оболочках и в некоторых настройках. вам придется убежать от !, если это ваш персонаж подстановки истории.

Ну, разве это не круто?

3 голосов
/ 25 ноября 2010

grep "db-connect.php" * |cut -d: -f1 |xargs grep "version"

Я не пробовал его в рекурсивном режиме, но он должен быть таким же.

1 голос
/ 26 ноября 2010

Использует PCRE (Perl-совместимые регулярные выражения) с многострочным сопоставлением и возвращает имена файлов, которые содержат обе строки (AND вместо OR).

grep -Plr '(?m)db-connect\.php(.*\n)*version|version(.*\n)*db-connect\.php' .
1 голос
/ 25 ноября 2010

Вы имеете в виду «string1» и «string2» в одной строке?

grep 'string1.*string2'

В одной строке, но в неопределенном порядке?

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

Или должны появиться обе строкив файле где-нибудь?

grep -e string1 -e string2
0 голосов
/ 01 августа 2013

Зачем придерживаться только grep:

perl -lne 'print if(/db-connect.php/&/version/)' *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...