Я могу искать файлы, которые имеют определенное слово, используя 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 ]
Что произойдет, если у вас есть 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] делает все необязательным перед ним (означает нуль или одно время всего совпадающего .*)