Existuje jednodušší způsob, jak to udělat? grep -v foo file | grep -v bar

Existují pravděpodobně velmi elegantní způsoby, jak to udělat s egrep, ale jak postupovat s obyčejným starým grepem?

EDIT: Zdá se, že grep -v "foo\|bar" file funguje pouze s GNU grep. Jsem na Solarisu. Máte k tomu nějaké řešení?

Komentáře

  • Zvláštní otázka, protože v prvním příkladu provádíte AND shodu a ve druhém děláte NEBO shodu . Výsledek bude stejný pouze za velmi konkrétních podmínek.
  • Ne, opravdu ne. V druhém příkladu je příznak -v negací. not(A or B) == not(A) and not(B)

Odpověď

Můžete mít více testů v single grep příkaz předáním každého výrazu s -e argumentem místo jako prvního nepovinného argumentu, jak běžně vidíte:

$ grep -v -e foo -e bar file 

To říká totéž, co váš příkaz: tisknout řádky z file, které neobsahují ani „foo“, ani „bar“ .

Mějte na paměti, že odstranění -v to úplně převrátí; mění také logickou operaci! Získáte všechny řádky, které obsahují „foo“ nebo „bar“.

Odpovědět

grep -Ev "word1|word2" by měl fungovat dobře

Komentáře

  • Jako alternativu můžete použít egrep a zrušit zpětné lomítko pro znak potrubí: egrep -v 'word1|word2
  • Ukázalo se, že to nefunguje s grepem Solaris. Nainstaloval jsem GNU grep a fungoval perfektně. ' upravím svoji otázku tak, aby byla specifická pro Solaris.
  • @rahmu \| je GNU grep rozšíření, ale stejného můžete dosáhnout přenosným způsobem pomocí -E a operátoru |.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *