Wie kann ich ein Wort mit grep ausschließen?

466

Ich brauche so etwas wie:

grep ^"unwanted_word"XXXXXXXX
John
quelle
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"
Kanagavelu Sugumar

Antworten:

802

Sie können dies mit der Option -v(for --invert-match) von grep tun als:

grep -v "unwanted_word" file | grep XXXXXXXX

grep -v "unwanted_word" filefiltert die Zeilen mit dem unwanted_wordund grep XXXXXXXXlistet nur Zeilen mit Muster auf XXXXXXXX.

BEARBEITEN:

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

grep -v 'unwanted_word' file
Codaddict
quelle
2
Was ist, wenn ich N Zeilen nach der Zeile auch mit "unerwünschtem Wort" ausschließen möchte? -v 'unwanted_word' --after Nhilft nicht, weil es die Zeile und N Zeilen danach enthält.
Andrey Regentov
-voder --invert-matchwählen Sie nicht übereinstimmende Zeilen aus. In deinem Fall grep -v 'unwanted_word' fileoder grep --invert-match 'unwanted_word' file.
adamski.pro
Ich möchte eine Zeile darüber und eine Zeile darunter mit übereinstimmendem Muster ignorieren. Wie kann ich das erreichen?
Kanji Viroja
Genial, ich benutze dies in Git, um schnell den Status meines Repos zu überprüfen, funktioniert wie ein Zauber:git status -s |grep -v "folder_I_dont_care"
Benjamin
3
Seltsam, es ist die beste Antwort, aber in einigen Fällen ist es falsch! Wenn ich sun, außer wenn es ist sunrise, eine grep sun|grep -v sunriseZeile überspringen möchte , die beide sunund sunrisegleichzeitig enthält, ist das nicht das, was ich will. grep -P 'sun(?!rise)'ist viel besser.
Greene
86

Ich verstand die Frage als "Wie kann ich ein Wort abgleichen, aber ein anderes ausschließen", für die eine Lösung zwei Greps in Serie sind: Erster Grep, der das gewünschte "Wort1" findet, zweiter Grep, der "Wort2" ausschließt:

grep "word1" | grep -v "word2"

In meinem Fall: Ich muss zwischen "plot" und "#plot" unterscheiden, was die Option "word" von grep nicht tut ("#" ist keine alphanumerische Zahl).

Hoffe das hilft.

JPGConnolly
quelle
16
Sie sollten die Reihenfolge umkehren, um die Hervorhebung zu aktivieren word1.
Matthew Read
1
Ich denke, es würde klarstellen, diesem Beispiel einen Platzhalter für den Dateinamen hinzuzufügen
Patrick
39

Wenn Sie grepden regulären Perl-Ausdruck mit -POption unterstützen, können Sie dies tun (wenn bash; wenn tcsh, müssen Sie dem entkommen !):

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

Demo:

$ cat file
foo1
foo2
foo3
foo4
bar
baz

Lassen Sie uns jetzt alle fooaußer auflistenfoo3

$ grep -P '(?!.*foo3)foo' file
foo1
foo2
foo4
$ 
Codaddict
quelle
Danke dafür, sehr nützlich! Ich möchte erwähnen, dass der Befehl grep standardmäßig
zwischen
2
Beachten Sie, dass dies grep -v -Pauch im regulären Ausdruck ohne Negation funktioniert.
Cybersoft
"Wenn du schlägst ... musst du dem entkommen !" . Danke danke danke! Das wollte ich!
Gabriel Staples
36

Die richtige Lösung ist die Verwendung grep -v "word" filemit dem awkÄquivalent:

awk '!/word/' file

Wenn Sie jedoch eine komplexere Situation haben, in der Sie beispielsweise XXXerscheinen und YYY nicht erscheinen möchten, ist dies awkpraktisch, anstatt mehrere greps zu leiten :

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

Sie können sogar etwas komplexeres sagen. Zum Beispiel: Ich möchte diese Zeilen, die entweder XXXoder enthalten YYY, aber nicht ZZZ:

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

usw.

fedorqui 'SO hör auf zu schaden'
quelle
2
Es scheint viel schneller zu sein als die grep -PLösung für große Dateien.
MBR
@MBR grep -Pbedeutet die Verwendung von Perl-Regexp. Das Laden dieses Pakets ist also weitaus teurer als normal grep.
Fedorqui 'SO hör auf zu schaden'
10

Invertiere die Übereinstimmung mit grep -v:

grep -v "unwanted word" file pattern
Garima
quelle
6

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 rekursive Suchoption wie folgt verwenden

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

Hier versucht grep, alle Vorkommen von 'want_pattern' in allen Dateien aus dem aktuellen Verzeichnis aufzulisten und an den zweiten grep zu übergeben, um das 'unerwünschte_Muster' herauszufiltern. '|' - Pipe weist die Shell an, die Standardausgabe des linken Programms (grep -r 'want_pattern' *) mit der Standardeingabe des rechten Programms (grep -v 'unerwünschtes_muster') zu verbinden.

Shriganesh Shintre
quelle
4

Die -vOption zeigt Ihnen alle Linien an, die nicht zum Muster passen.

grep -v ^unwanted_word
st0le
quelle
-5

Ich habe ein Verzeichnis mit einer Reihe von Dateien. Ich möchte alle Dateien finden, die NICHT die Zeichenfolge "speedup" enthalten, daher habe ich den folgenden Befehl erfolgreich verwendet:

grep -iL speedup *
pjrieger
quelle
1
Auf der Manpage: "-L, --files-without-match Unterdrückt die normale Ausgabe; druckt stattdessen den Namen jeder Eingabedatei, aus der normalerweise keine Ausgabe gedruckt worden wäre. Der Scanvorgang wird bei der ersten Übereinstimmung beendet. " (Hervorhebung von mir) Also hüte dich davor!
Xuiqzy