Gibt es eine einfachere Möglichkeit, dies zu tun? grep -v foo file | grep -v bar
Es gibt wahrscheinlich sehr elegante Möglichkeiten, dies mit egrep zu tun, aber wie geht man mit einfachem altem grep um?
BEARBEITEN: grep -v "foo\|bar" file
scheint nur mit GNU grep zu funktionieren. Ich bin unter Solaris. Gibt es eine Lösung dafür?
Kommentare
- Seltsame Frage, weil Sie im ersten Beispiel AND Match und im zweiten OR Match machen . Das Ergebnis wird nur unter ganz bestimmten Bedingungen das gleiche sein.
- Nein, nicht wirklich. Im zweiten Beispiel ist das Flag
-v
eine Negation.not(A or B) == not(A) and not(B)
Antwort
Sie können mehrere Tests in a durchführen einzelner grep
-Befehl, indem jeder Ausdruck mit einem -e
-Argument übergeben wird, anstatt als erstes Nichtoptionsargument, wie Sie normalerweise sehen:
$ grep -v -e foo -e bar file
Das sagt dasselbe aus, was Ihr Befehl tut: Drucken Sie Zeilen von file
, die weder „foo“ noch „bar“ enthalten.
Beachten Sie, dass das Entfernen von -v
dies vollständig umkehrt. es ändert auch die logische Operation! Sie erhalten alle Zeilen, die „foo“ oder „bar“ enthalten.
Antwort
grep -Ev "word1|word2"
sollte einwandfrei funktionieren
Kommentare
- Alternativ können Sie egrep verwenden und den Backslash für das löschen Pipe-Zeichen:
egrep -v 'word1|word2
- Es stellt sich heraus, dass dies mit Solaris grep nicht funktioniert. Ich habe das GNU grep installiert und perfekt funktioniert. Ich ' werde meine Frage bearbeiten, um sie Solaris-spezifisch zu machen.
- @rahmu
\|
ist ein GNU-Grep Erweiterung, aber Sie können dasselbe auf tragbare Weise mit-E
und dem Operator|
erreichen.