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?


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”.


12

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


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”
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.