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


12

Чи є простіший спосіб зробити це? grep -v foo file | grep -v bar

Напевно, є дуже вишукані способи зробити це зі старістю, але як рухатись із звичайною старою грепою?

EDIT: grep -v 'foo\|bar' fileначебто, працює лише з GNU grep. Я на Солярісі. Будь-яке рішення для цього?


Дивне питання, тому що в першому прикладі ви робите І збігаєтесь, а в другому ви збираєте АБО матч. Результат буде однаковим лише у дуже конкретних умовах.
greenoldman

1
Ні, не дуже. У другому прикладі -vпрапор є запереченням. not(A or B) == not(A) and not(B)
rahmu

Відповіді:


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
рису

Виявляється, це не працює з грепом Solaris. Я встановив GNU grep і працював чудово. Я збираюсь відредагувати своє питання, щоб зробити Solaris конкретним.
rahmu

2
@rahmu \|- це розширення GNU grep, але ви можете домогтися того ж, що й портативно, -Eі з |оператором.
Жил 'SO- перестань бути злим'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.