Я могу искать файлы, у которых есть определенное слово, используя 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»?
Используйте каналы для последовательной фильтрации строк, пока Вы не получаете то, что Вы хотите:
grep word1 /path | grep word2 | grep word3 | grep word4
Что происходит, если у Вас были слова N в строках? Тогда необходимо ли использовать N, переданный по каналу grep
команды?
grep word1 /path | grep word2 | grep word3 | grep word4 | grep word5 | ... | grep wordN
Здесь использует только один grep
и согласующий отрезок длинной линии, если содержит несколько слов:
grep -E 'word1.*word2.*word3.*word4.*' /path
команда Above моделирует И grep's использования -E
опция. Эта команда будет работать, если Ваши слова в строке будут в том же порядке, и будут сбои, если у Вас была строка как ниже:
word4 and word3 and word2 and word1
идея использует grep с -P
опция (Perl-Compatibility) и предварительный regex (?=(regex))
:
grep -P '(?=.*?word1)(?=.*?word2)(?=.*?word4)(?=.*?word3)' /path
.*?
средства, соответствующие каждому символы .
, который повторил нуль или больше раз *
, в то время как они являются дополнительными. Эти ?
делает все дополнительным перед ним (нуль средств, или одно время всего соответствовало .*
)