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?

Rahmu
quelle
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.

Warren Young
quelle
12

grep -Ev 'word1|word2' sollte gut funktionieren

Lass mich sein
quelle
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'