Używanie grep -v dla wielu argumentów

12

Czy istnieje prostszy sposób na zrobienie tego? grep -v foo file | grep -v bar

Prawdopodobnie istnieją bardzo eleganckie sposoby, aby to zrobić za pomocą egrep, ale jak przejść do zwykłego starego grepa?

EDYCJA: grep -v 'foo\|bar' filewydaje się działać tylko z GNU grep. Jestem na Solarisie. Jakieś rozwiązanie tego?

rahmu
źródło
Dziwne pytanie, ponieważ w pierwszym przykładzie wykonujesz operację ORAZ, a w drugiej - OR. Wynik będzie taki sam tylko w bardzo szczególnych warunkach.
greenoldman,
1
Nie, nie bardzo. W drugim przykładzie -vflaga jest negacją. not(A or B) == not(A) and not(B)
rahmu

Odpowiedzi:

21

Można wykonać wiele testów w jednym greppoleceniu, przekazując każde wyrażenie z -eargumentem zamiast jako pierwszy argument nie będący opcją, jak zwykle:

$ grep -v -e foo -e bar file

Oznacza to to samo, co polecenie: wypisuje z niego wiersze, filektóre nie zawierają ani „foo”, ani „bar”.

Pamiętaj, że usunięcie -vcałkowicie odwraca to; zmienia także logiczną operację! Otrzymasz wszystkie wiersze zawierające „foo” lub „bar”.

Warren Young
źródło
12

grep -Ev 'word1|word2' powinien działać dobrze

Šimon Tóth
źródło
Alternatywnie możesz użyć egrep i upuścić ukośnik dla znaku potoku:egrep -v 'word1|word2
OldTimer
Okazuje się, że to nie działa z grepem Solaris. Zainstalowałem GNU grep i działałem idealnie. Zmienię moje pytanie, aby było specyficzne dla systemu Solaris.
rahmu
2
@rahmu \|jest rozszerzeniem GNU grep, ale można osiągnąć to samo w przenośny sposób z -Ei |operatora.
Gilles „SO- przestań być zły”