Поиск файлов содержит строки со многими условиями

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

grep -l "word" /path

Однако что, если я хочу искать файлы, которые имеют слово «слово 1» и «слово 2» в такая же линия? Я могу использовать:

mkdir new;for i in * do;grep "word 1" $i > new/$i_new;done

, затем использовать

grep -l "word 2" /new

Но я хотел бы иметь команду с одной строкой. Используя

egrep -w -R 'word 1|word 2' /path

только поиск строк имеет слово «слово 1» ИЛИ «слово 2».

Что делать, если у меня есть слово «слово 3», «слово 4»? [!d5 ]

1
задан 3 July 2014 в 22:28

1 ответ

Что произойдет, если у вас есть N слов в строках? Затем вам нужно использовать команды N piped grep?

grep word1 /path | grep word2 | grep word3 | grep word4 | grep word5 | ... | grep wordN

Здесь используется только одна grep и соответствующая строка, если она содержит несколько слов:

grep -E 'word1.*word2.*word3.*word4.*' /path

Выше команда имитирует и использует параметр grep -E. Эта команда будет работать, если ваши слова в строке находятся в одном порядке и не удастся, если у вас есть строка, как показано ниже:

word4 and word3 and word2 and word1

Итак, какая новая идея для работы / поиска совпадений в любом порядке ?

Идея использует grep с опцией -P (Perl-Compatibility) и регулярным выражением lookahead (?=(regex)):

grep -P '(?=.*?word1)(?=.*?word2)(?=.*?word4)(?=.*?word3)' /path
.*? означает соответствие каждому символу , который повторял ноль или более раз *, пока они являются необязательными. [F13] делает все необязательным перед ним (означает нуль или одно время всего совпадающего .*)
2
ответ дан 24 May 2018 в 06:02
  • 1
    Спасибо за Ваш ответ. Действительно ли Perl-совместимость позволяет использовать Perl в grep? – Ooker 4 January 2015 в 17:58
  • 2
    Не совсем, но тесно. см. man pcre – αғsнιη 4 January 2015 в 18:01

Другие вопросы по тегам:

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