Использование grep -v для нескольких аргументов

12

Есть ли более простой способ сделать это? grep -v foo file | grep -v bar

Вероятно, есть очень элегантные способы сделать это с помощью egrep, но как использовать старый добрый grep?

РЕДАКТИРОВАТЬ: grep -v 'foo\|bar' fileкажется, работает только с GNU grep. Я на Солярисе. Любое решение для этого?

rahmu
источник
Странный вопрос, потому что в первом примере вы делаете И совпадают, а во втором вы делаете ИЛИ совпадают. Результат будет таким же только в очень специфических условиях.
Гринольдман
1
Нет, не совсем. Во втором примере -vфлаг является отрицанием. not(A or B) == not(A) and not(B)
Рахму

Ответы:

21

Вы можете иметь несколько тестов в одной grepкоманде, передавая каждое выражение с -eаргументом вместо первого аргумента без опций, как вы обычно видите:

$ grep -v -e foo -e bar file

Это говорит о том же, что и ваша команда: выводить строки, fileкоторые не содержат ни «foo», ни «bar».

Имейте в виду, что удаление -vполностью инвертирует это; это также меняет логическую операцию! Вы получаете все строки, которые содержат «foo» или «bar».

Уоррен Янг
источник
12

grep -Ev 'word1|word2' должно работать просто отлично

Шимон Тот
источник
В качестве альтернативы вы можете использовать egrep и удалить обратную косую черту для символа канала:egrep -v 'word1|word2
OldTimer
Оказывается, это не работает с grep Solaris. Я установил GNU grep и работал отлично. Я собираюсь отредактировать свой вопрос, чтобы сделать его специфичным для Solaris.
Рахму
2
@rahmu \|является расширением GNU grep, но вы можете достичь того же самого с -Eпомощью |оператора.
Жиль "ТАК - перестань быть злым"