Verwenden von grep -v für mehrere Argumente


12

Gibt es einen einfacheren Weg, 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?

EDIT: grep -v 'foo\|bar' filescheint nur mit GNU grep zu funktionieren. Ich bin auf Solaris. Irgendeine Lösung dafür?


Seltsame Frage, weil Sie im ersten Beispiel AND Match machen und im zweiten OR Match. Das Ergebnis wird nur unter sehr spezifischen Bedingungen das gleiche sein.
Greenoldman

1
Nein nicht wirklich. Im zweiten Beispiel ist das -vFlag eine Negation. not(A or B) == not(A) and not(B)
Rahm

Antworten:


21

Sie können mehrere Tests in einem einzigen grepBefehl durchführen, indem Sie jeden Ausdruck mit einem -eArgument übergeben, anstatt als erstes Argument ohne Option, wie Sie normalerweise sehen:

$ grep -v -e foo -e bar file

Das sagt dasselbe, was Ihr Befehl tut: Druckzeilen filedavon enthalten weder "foo" noch "bar".

Denken Sie daran, dass das Entfernen dies -vvollständig umkehrt. es ändert auch die logische Operation! Sie erhalten alle Zeilen, die "foo" oder "bar" enthalten.


12

grep -Ev 'word1|word2' sollte gut funktionieren


Alternativ können Sie egrep verwenden und den Backslash für das Pipe-Zeichen egrep -v 'word1|word2
löschen

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.
Rahm

2
@rahmu \|ist eine GNU- Grep- Erweiterung, aber Sie können dasselbe auf tragbare Weise mit -Eund dem |Bediener erreichen.
Gilles 'SO - hör auf böse zu sein'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.