So invertieren Sie einen grep-Ausdruck

237

Der folgende grep-Ausdruck listet erfolgreich alle EXE- und HTML-Dateien im aktuellen Verzeichnis und in den Unterverzeichnissen auf.

ls -R |grep -E .*[\.exe]$\|.*[\.html]$  

Wie invertiere ich dieses Ergebnis, um diejenigen aufzulisten, die stattdessen keine .html- oder .exe-Datei sind? (Das heißt , !=.)

sMaN
quelle

Antworten:

337

Verwenden Sie die Befehlszeilenoption -voder --invert-match,

ls -R |grep -v -E .*[\.exe]$\|.*[\.html]$
Eric Fortis
quelle
4
Es ist zu beachten, dass -v/ --invert-matchnicht unbedingt umdreht, ob der Rückkehrcode von grepeine erfolgreiche Ausführung anzeigt, sondern stattdessen mit den Zeilen übereinstimmt, die sonst nicht übereinstimmen würden. Diejenigen, die den Rückkehrcode invertieren möchten (dh erfolgreich sind, wenn nicht alle Zeilen mit dem Muster übereinstimmen, sondern mindestens eine), sollten verwenden ! grep. Dies findet Verwendung in bedingten Ausdrücken, z if ! ls | grep -qE ".(\.exe)$"; then echo No .exe files in $(pwd); fi.
Zyl
98
grep -v

oder

grep --invert-match

Sie können dasselbe auch tun mit find:

find . -type f \( -iname "*" ! -iname ".exe" ! -iname ".html"\)

Mehr Infos hier .

Darioo
quelle
2
Der findBefehl ist die semantischste Lösung für dieses XY-Problem. Kombinieren lsund grepzu diesem Zweck scheint bestenfalls hacky. Dies sollte die akzeptierte Antwort sein. (+1)
Eric Seastrand
4
@Eric Unabhängig von den Anforderungen des OP ist das Invertieren eines grep-Ausdrucks viel mehr als nur das Suchen von Dateien. Ich bezweifle, dass dies der Grund ist, warum die meisten Leute hierher kommen.
Byxor
30

Fügen Sie -vIhrem grepBefehl die Option hinzu, um die Ergebnisse umzukehren.

Rob Sobers
quelle
9
 grep "subscription" | grep -v "spec"  
Anja Ishmukhametova
quelle
7

Wie mehrfach angegeben, wird die Inversion durch die -vOption erreicht grep. Lassen Sie mich den (hoffentlich amüsanten) Hinweis hinzufügen, dass Sie dies selbst hätten herausfinden können, indem Sie den Hilfetext durchgesehen haben grep:

grep --help | grep invert

-v, --invert-match wählt nicht übereinstimmende Zeilen aus

jmd_dk
quelle