Как найти несколько строк в разных строках из всего каталога и подкаталогов на терминале Linux?

drwxr -xr -x 5 root root 4096 25 июня 09 :46 кэш drwxr -xr -x 9 root root 4096 25 июня 09 :46 lib drwxr -xr -x 2 root root 4096 25 мая 10 :11 локальный lrwxrwxrwx 1 root root 11 25 мая 10 :11 блокировка ->../run/lock lrwxrwxrwx 1 root root 12 25 мая 10 :11 log -> volatile/log lrwxrwxrwx 1 root root 6 25 мая 10 :11 run ->../run drwxr -xr -x 3 root root 4096 25 июня 09 :46 катушка lrwxrwxrwx 1 root root 12 25 мая 10 :11 tmp -> volatile/tmp drwxrwxrwt 4 root root 80 25 июня 09 :46 volatile

Из-за этого энергозависимого монтирования журналы не сохраняются после загрузки.

-1
28.08.2020, 22:37
5 ответов

Для этого предназначены предпросмотры. Вызовите grep в режиме PCRE -Pи режиме slurp -z. Затем перечислите входной файл, который удовлетворяет 3 прогнозам. (?s:.....)сделает точку .новой строкой.

$ grep -Plz '(?s:(?=.*John)(?=.*Riya)(?=.*bug))'  file

$ grep -Plzr '(?s:.....)'.

Будет рекурсивно и выведен список соответствующих файлов в текущем каталоге.

4
18.03.2021, 23:09

Вы можете использовать findс несколькими последовательностями -exec grepдля соответствия каждому шаблону:

find. -type f -exec grep -q "John" {} \; -exec grep -q "Riya" {} \; -print

Это не так плохо, как кажется, так как findостановится при первом неудачном тесте.

2
18.03.2021, 23:09

Вы можете использовать xargs:

grep -rlZ John. | xargs -r0 grep -lZ Ryia | xargs -r0 grep -l bug

grep -rlZ John :Будет рекурсивно(-r)выполнять grep John во всех файлах и печатать только имена файлов(-l). -Zгарантирует, что любые необычные символы, такие как символы новой строки, будут напечатаны и отправлены в следующую команду правильно.

xargs -r0 grep -lZ Ryia:xargs передаст имена файлов в предыдущем канале в качестве аргументов для следующего grep -, который ищет «Riya». Опция -r0для xargs на самом деле представляет собой две опции -, каждая из которых относится к обработке необычных символов имени файла. Этот grep ищет «Riya» в файлах, в которых уже есть «John», и передает эти имена файлов в следующий канал

xargs -r0 grep -l bug:Наконец, «ошибка» ищется во всех файлах, в которых уже есть «Джон» и «Рия», а затем печатается окончательный список файлов.

0
18.03.2021, 23:09

Учитывая 2 файла example_1.txtиexample_2.txt:

find./ -type f -name "*1.txt" -exec grep -E "John|Riya|bug" {} \;

Если подстановочного знака недостаточно, вы можете использовать параметр -regexиз поиска

0
18.03.2021, 23:09

Добавить в @Rakesh _Ответ Шармы

grep -rzl 'John\b.*Riya\b.*\bbug\b' ./

порядок паттернов не имеет значения:

grep -l 'bug' "$(grep -l 'Riya' "$(grep -lr 'John'./)")"
0
18.03.2021, 23:09

Теги

Похожие вопросы