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
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.
-v
en negation.not(A or B) == not(A) and not(B)