Подтвердить что ты не робот

Grep Поиск всех файлов в каталоге для string1 AND string2

Как я могу использовать grep в cygwin для поиска всех файлов, содержащих слова BOTH.

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

grep -r "db-connect.php" .

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

Я пробовал это: grep -r "db-connect.php\|version" ., но это OR, то есть он получает файл, который содержит тот или иной.

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

4b9b3361

Ответ 1

grep -r db-connect.php . | grep version

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

В 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' *

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

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

Ответ 5

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

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

Ответ 6

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

grep 'string1.*string2'

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

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

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

grep -e string1 -e string2

Ответ 7

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

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

Ответ 8

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

perl -lne 'print if(/db-connect.php/&/version/)' *