Grep egrep несколько строк

Предположим, что у меня есть несколько строк: str1 и str2 и str3.

  • Как найти строки со всеми строками?
  • Как найти строки, которые могут иметь любой из них?
  • И как найти строки с str1 и str2 и str3 [но не оба?]?

Ответы

Ответ 1

Это выглядит как три вопроса. Самый простой способ собрать эти выражения вместе - это несколько каналов. Там нет стыда, особенно потому, что регулярное выражение (с использованием egrep) было бы неуклюжим, поскольку вы, кажется, подразумеваете, что хотите независимость заказа.

Итак, по порядку,

  • grep str1 | grep str2 | grep str3

  • egrep '(str1 | str2 | str3)'

  • grep str1 | egrep '(str2 | str3)'

вы можете сделать "и" форму в независимом порядке, используя egrep, но я думаю, вам будет легче запомнить независимость от заказа и использовать с помощью конвейерных команд grep и order независимо или с использованием регулярных выражений.

Ответ 2

Вы не можете разумно выполнить "все" или "этот плюс любой из этих" случаев, потому что grep не поддерживает lookahead. Используйте Perl. Для "любого" случая это egrep '(str1|str2|str3)' file.

Необоснованный способ сделать "все" случай:

egrep '(str1.*str2.*str3|str3.*str1.*str2|str2.*str1.*str3|str1.*str3.*str2)' file

то есть. вы строите перестановки. Это, конечно, смешная вещь.

Для "этого плюс любого из них" аналогично:

egrep '(str1.*(str2|str3)|(str2|str3).*str1)' file

Ответ 3

grep -E --color "string1 | string2 | string3...."

например, чтобы определить, работает ли наша система с процессором AMD (svm) или Intel (vmx) и 64-битная (lm) lm для длинного режима, что означает 64-битный...

пример команды:

grep -E --color "lm | svm | vmx" /proc/cpuinfo

-E необходимо найти несколько строк

Ответ 4

Лично я делаю это в perl, а не пытаюсь собрать что-то с grep.

Например, для первого:

while (<FILE>)
{
   next if ! m/pattern1/;
   next if ! m/pattern2/;
   next if ! m/pattern3/;

   print $_;
}