it-swarm.com.de

Wie kann ich ein Wort mit grep ausschließen?

Ich brauche so etwas wie:

grep ^"unwanted_Word"XXXXXXXX
410
john

Sie können dies auch mit der Option -v (für --invert-match) von grep als:

grep -v "unwanted_Word" file | grep XXXXXXXX

grep -v "unwanted_Word" file filtert die Zeilen mit dem unwanted_Word und grep XXXXXXXX listet nur Zeilen mit dem Muster XXXXXXXX auf.

EDIT:

Aus Ihrem Kommentar geht hervor, dass Sie alle Zeilen ohne den unwanted_Word auflisten möchten. In diesem Fall brauchen Sie nur:

grep -v 'unwanted_Word' file
713
codaddict

Ich verstand die Frage als "Wie kann ich ein Wort finden, aber ein anderes ausschließen", für die eine Lösung zwei Greps in Serie sind: Erstens grep das gesuchte "Word1" finden, zweitens grep "Word2" ausschließen:

grep "Word1" | grep -v "Word2"

In meinem Fall: Ich muss zwischen "plot" und "#plot" unterscheiden, was mit der "Word" -Option von grep nicht möglich ist ("#" ist kein alphanumerisches Zeichen).

Hoffe das hilft.

77
JPGConnolly

Wenn Ihr grep reguläre Perl-Ausdrücke mit der Option -P unterstützt, können Sie Folgendes tun (wenn bash; wenn tcsh, müssen Sie den ! entziehen):

grep -P '(?!.*unwanted_Word)keyword' file

Demo:

$ cat file
foo1
foo2
foo3
foo4
bar
baz

Lassen Sie uns nun alle foo mit Ausnahme von foo3 auflisten.

$ grep -P '(?!.*foo3)foo' file
foo1
foo2
foo4
$ 
33
codaddict

Die richtige Lösung ist die Verwendung von grep -v "Word" file mit dem entsprechenden awk:

awk '!/Word/' file

Wenn Sie jedoch eine komplexere Situation haben, in der XXX angezeigt werden soll und YYYnicht angezeigt werden soll, ist awk praktisch anstatt mehrere greps zu leiten:

awk '/XXX/ && !/YYY/' file
#    ^^^^^    ^^^^^^
# I want it      |
#            I don't want it

Man kann sogar etwas Komplexeres sagen. Zum Beispiel: Ich möchte, dass diese Zeilen entweder XXX oder YYY, aber nicht ZZZ enthalten:

awk '(/XXX/ || /YYY/) && !/ZZZ/' file

usw.

29
fedorqui

Übereinstimmungen mit grep -v invertieren:

grep -v "unwanted Word" file pattern
10
garima

grep bietet die Option '-v' oder '--invert-match', um nicht übereinstimmende Zeilen auszuwählen.

z.B.

grep -v 'unwanted_pattern' file_name

Dadurch werden alle Zeilen aus der Datei dateiname ausgegeben, die kein 'unerwünschtes_muster' enthält.

Wenn Sie das Muster in mehreren Dateien in einem Ordner suchen, können Sie die Option für die rekursive Suche wie folgt verwenden

grep -r 'wanted_pattern' * | grep -v 'unwanted_pattern'

Hier versucht grep, alle Vorkommen von 'wanted_pattern' in allen Dateien des aktuellen Verzeichnisses aufzulisten und an second grep weiterzuleiten, um das 'unerwünschte_pattern' herauszufiltern. '|' - pipe weist Shell an, die Standardausgabe des linken Programms (grep -r 'wanted_pattern' *) mit der Standardeingabe des rechten Programms (grep -v 'unusual_pattern') zu verbinden.

4

Die Option -v zeigt Ihnen alle Linien, die nicht mit dem Muster übereinstimmen.

grep -v ^unwanted_Word
4
st0le