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).
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 YYYnicht 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:
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.
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:
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!
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"
Antworten:
Sie können dies mit der Option
-v
(for--invert-match
) von grep tun als:grep -v "unwanted_word" file
filtert die Zeilen mit demunwanted_word
undgrep XXXXXXXX
listet nur Zeilen mit Muster aufXXXXXXXX
.BEARBEITEN:
Aus Ihrem Kommentar geht hervor, dass Sie alle Zeilen ohne das auflisten möchten
unwanted_word
. In diesem Fall brauchen Sie nur:quelle
-v 'unwanted_word' --after N
hilft nicht, weil es die Zeile und N Zeilen danach enthält.-v
oder--invert-match
wählen Sie nicht übereinstimmende Zeilen aus. In deinem Fallgrep -v 'unwanted_word' file
odergrep --invert-match 'unwanted_word' file
.git status -s |grep -v "folder_I_dont_care"
sun
, außer wenn es istsunrise
, einegrep sun|grep -v sunrise
Zeile überspringen möchte , die beidesun
undsunrise
gleichzeitig enthält, ist das nicht das, was ich will.grep -P 'sun(?!rise)'
ist viel besser.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:
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.
quelle
word1
.Wenn Sie
grep
den regulären Perl-Ausdruck mit-P
Option unterstützen, können Sie dies tun (wenn bash; wenn tcsh, müssen Sie dem entkommen!
):Demo:
Lassen Sie uns jetzt alle
foo
außer auflistenfoo3
quelle
grep -v -P
auch im regulären Ausdruck ohne Negation funktioniert.!
" . Danke danke danke! Das wollte ich!Die richtige Lösung ist die Verwendung
grep -v "word" file
mit demawk
Äquivalent:Wenn Sie jedoch eine komplexere Situation haben, in der Sie beispielsweise
XXX
erscheinen undYYY
nicht erscheinen möchten, ist diesawk
praktisch, anstatt mehreregrep
s zu leiten :Sie können sogar etwas komplexeres sagen. Zum Beispiel: Ich möchte diese Zeilen, die entweder
XXX
oder enthaltenYYY
, aber nichtZZZ
:usw.
quelle
grep -P
Lösung für große Dateien.grep -P
bedeutet die Verwendung von Perl-Regexp. Das Laden dieses Pakets ist also weitaus teurer als normalgrep
.Invertiere die Übereinstimmung mit grep -v:
quelle
grep bietet die Option '-v' oder '--invert-match', um nicht übereinstimmende Zeilen auszuwählen.
z.B
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
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.
quelle
Die
-v
Option zeigt Ihnen alle Linien an, die nicht zum Muster passen.quelle
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:
quelle