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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.