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

Prawdopodobnie istnieją bardzo eleganckie sposoby na zrobienie tego za pomocą egrep, ale jak przejść ze zwykłym starym grepem?

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

Komentarze

  • Dziwne pytanie, ponieważ w pierwszym przykładzie wykonujesz ORAZ dopasowujesz, aw drugim robisz LUB dopasowujesz . Wynik będzie taki sam tylko w bardzo specyficznych warunkach.
  • Nie, nie do końca. W drugim przykładzie flaga -v jest negacją. not(A or B) == not(A) and not(B)

Odpowiedź

Możesz mieć wiele testów w pojedyncze polecenie grep, przekazując każde wyrażenie z argumentem -e zamiast jako pierwszy argument niebędący opcją, jak zwykle:

$ grep -v -e foo -e bar file 

To mówi to samo, co twoje polecenie: wypisuje wiersze z file, które nie zawierają ani „foo”, ani „bar” .

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

Answer

grep -Ev "word1|word2" powinno działać dobrze

Komentarze

  • Alternatywnie możesz użyć egrep i pozostawić lewy ukośnik pionowa kreska: egrep -v 'word1|word2
  • Okazuje się, że to nie działa z grepem Solaris. Zainstalowałem GNU grep i działałem doskonale. ' Mam zamiar edytować moje pytanie, aby było specyficzne dla Solaris.
  • @rahmu \| to GNU grep rozszerzenie, ale możesz osiągnąć to samo w przenośny sposób za pomocą operatora -E i |.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *