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

Я могу искать файлы, у которых есть определенное слово, используя 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»?

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

2 ответа

Используйте каналы для последовательной фильтрации строк, пока Вы не получаете то, что Вы хотите:
grep word1 /path | grep word2 | grep word3 | grep word4

1
ответ дан 3 July 2014 в 21:28

Что происходит, если у Вас были слова 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
  • .*? средства, соответствующие каждому символы ., который повторил нуль или больше раз *, в то время как они являются дополнительными. Эти ? делает все дополнительным перед ним (нуль средств, или одно время всего соответствовало .*)
2
ответ дан 3 July 2014 в 21:28

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

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