Finns det ett enklare sätt att göra detta? grep -v foo file | grep -v bar

Det finns förmodligen mycket eleganta sätt att göra det med egrep, men hur går man med vanlig gammal grep?

EDIT: grep -v "foo\|bar" file verkar bara fungera med GNU grep. Jag är på Solaris. Någon lösning för det?

Kommentarer

  • Konstig fråga eftersom du i det första exemplet gör OCH matchar, och i det andra gör du ELLER matchar . Resultatet blir detsamma endast under mycket specifika förhållanden.
  • Nej egentligen inte. I det andra exemplet är flaggan -v en negation. not(A or B) == not(A) and not(B)

Svar

Du kan ha flera tester i en enda grep -kommando genom att skicka varje uttryck med ett -e -argument istället för som det första icke-alternativargumentet som du normalt ser:

$ grep -v -e foo -e bar file 

Det säger samma sak som ditt kommando gör: skriv ut rader från file som varken innehåller ”foo” eller ”bar” .

Tänk på att borttagning av -v inverterar detta helt; det ändrar också den logiska funktionen! Du får alla rader som innehåller ”foo” eller ”bar”.

Svar

grep -Ev "word1|word2" ska fungera bra

Kommentarer

  • Som ett alternativ kan du använda egrep och släppa snedstrecket för rörkaraktär: egrep -v 'word1|word2
  • Visas att detta inte fungerar med Solaris grep. Jag installerade GNU grep och fungerade perfekt. Jag ' ska redigera min fråga för att göra den Solaris-specifik.
  • @rahmu \| är en GNU grep förlängning, men du kan uppnå samma sak på ett bärbart sätt med -E och | operatören.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *