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


12

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

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

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


Странный вопрос, потому что в первом примере вы делаете И совпадают, а во втором вы делаете ИЛИ совпадают. Результат будет таким же только в очень специфических условиях.
Гринольдман

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помощью |оператора.
Жиль "ТАК - перестань быть злым"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.