So schließen Sie Muster, Dateien und Verzeichnisse mit grep aus
Veröffentlicht: 2022-06-29
Seit 1974 hilft der Linux-Befehl grep
Leuten, Strings in Dateien zu finden. Aber manchmal ist grep
einfach zu gründlich. Hier sind mehrere Möglichkeiten, grep
, verschiedene Dinge zu ignorieren.
Der grep-Befehl
Der Befehl grep
durchsucht Textdateien nach Zeichenfolgen, die den Suchmustern entsprechen, die Sie in der Befehlszeile angeben. Die Stärke von grep
liegt in der Verwendung regulärer Ausdrücke. Damit können Sie beschreiben, wonach Sie suchen, anstatt es explizit definieren zu müssen.
Die Geburt von grep
liegt vor Linux. es wurde in den frühen 1970er Jahren auf Unix entwickelt. Seinen Namen hat er von der g/re/p-Tastenfolge im ed
-Line-Editor (übrigens „ee-dee“ ausgesprochen). Das stand für Global , Regular Express Search, Print Matching Lines.
grep
ist berühmt – vielleicht notorisch – gründlich und zielstrebig. Manchmal durchsucht es Dateien oder Verzeichnisse, mit denen Sie lieber keine Zeit verschwenden möchten, da die Ergebnisse dazu führen können, dass Sie den Wald vor lauter Bäumen nicht mehr sehen können.
Natürlich gibt es Möglichkeiten, grep zu beherrschen. Sie können es anweisen, Muster, Dateien und Verzeichnisse zu ignorieren, damit grep seine Suche schneller abschließt und Sie nicht mit bedeutungslosen Fehlalarmen überschwemmt werden.
Ausgenommen Muster
Um mit grep
zu suchen, können Sie Eingaben von einem anderen Prozess wie cat
oder einen Dateinamen als letzten Befehlszeilenparameter angeben.
Wir verwenden eine kurze Datei, die den Text des Gedichts Jabberwocky von Lewis Carroll enthält. In diesen beiden Beispielen suchen wir nach Zeilen, die dem Suchbegriff „Jabberwock“ entsprechen.
Katze jabberwocky.txt | grep "Jabberwock"
grep "Jabberwock" jabberwocky.text
Die Zeilen, die Übereinstimmungen mit dem Suchhinweis enthalten, werden für uns aufgelistet, wobei das übereinstimmende Element in jeder Zeile rot hervorgehoben wird. Das ist eine einfache Suche. Was aber, wenn wir Zeilen ausschließen wollen, die das Wort „Jabberwock“ enthalten, und den Rest drucken?
Wir können dies mit der Option -v
(invert match) erreichen. Hier werden die Zeilen aufgelistet, die nicht mit dem Suchbegriff übereinstimmen.
grep -v "Jabberwock" jabberwocky.text
Die Zeilen, die „Jabberwock“ nicht enthalten, werden im Terminalfenster aufgelistet.
Wir können beliebig viele Begriffe ausschließen. Lassen Sie uns alle Zeilen herausfiltern, die „Jabberwock“ enthalten, sowie alle Zeilen, die „and“ enthalten. Um dies zu erreichen, verwenden wir die Option -e
(Ausdruck). Wir müssen es für jedes Suchmuster verwenden, das wir verwenden.
grep -v -e "Jabberwock" -e "und" jabberwocky.txt
Es gibt einen entsprechenden Rückgang in der Anzahl der Zeilen in der Ausgabe.
Wenn wir die Option -E
(erweiterte reguläre Ausdrücke) verwenden, können wir die Suchmuster mit „ |
“, was in diesem Zusammenhang keinen senkrechten Strich bedeutet, sondern der logische OR
-Operator.
grep -Ev "Jabberwock|und" jabberwocky.txt
Wir erhalten genau die gleiche Ausgabe wie beim vorherigen, langatmigeren Befehl.
Das Format des Befehls ist dasselbe, wenn Sie anstelle eines expliziten Suchhinweises ein Regex-Muster verwenden möchten. Dieser Befehl schließt alle Zeilen aus, die mit einem beliebigen Buchstaben in der Gruppe „ACHT“ beginnen.
grep -Ev "^ACHT" jabberwocky.txt
Um Zeilen zu sehen, die ein Muster, aber kein anderes Muster enthalten, können wir grep
in grep
. Wir suchen nach allen Zeilen, die das Wort „Jabberwock“ enthalten, und filtern dann alle Zeilen heraus, die auch das Wort „slain“ enthalten.
grep "Jabberwock" jabberwocky.txt | grep -v "erschlagen"

Ausgenommen Dateien
Wir können grep
bitten, in einer Sammlung von Dateien nach einer Zeichenfolge oder einem Muster zu suchen. Sie könnten jede Datei in der Befehlszeile auflisten, aber bei vielen Dateien skaliert dieser Ansatz nicht.
grep "vorpal" Vers-1.txt Vers-2.txt Vers-3.txt Vers-4.txt Vers-5.txt Vers-6.txt
Beachten Sie, dass der Name der Datei, die die übereinstimmende Zeile enthält, am Anfang jeder Ausgabezeile angezeigt wird.
Um die Tipparbeit zu reduzieren, können wir Wildcards verwenden. Aber das kann kontraintuitiv sein. Dies scheint zu funktionieren.
grep "vorpal" *.txt
In diesem Verzeichnis befinden sich jedoch andere TXT-Dateien, die nichts mit dem Gedicht zu tun haben. Wenn wir mit derselben Befehlsstruktur nach dem Wort „Schwert“ suchen, erhalten wir viele Fehlalarme.
grep "Schwert" *.txt
Die gewünschten Ergebnisse werden durch die Flut falscher Ergebnisse aus anderen Dateien mit der Erweiterung TXT überdeckt.
Das Wort „vorpal“ stimmte mit nichts überein, aber „sword“ ist im Wort „password“ enthalten, sodass es in einigen Pseudo-Logfiles häufig gefunden wurde.
Wir müssen diese Dateien ausschließen. Dazu verwenden wir die Option --exclude
. Um eine einzelne Datei namens „vol-log-1.txt“ auszuschließen, verwenden wir diesen Befehl:
grep --exclude=vol-log-1.txt "Schwert" *.txt
In diesem Fall möchten wir mehrere Protokolldateien ausschließen, deren Namen mit „vol.“ beginnen. Die Syntax, die wir brauchen, ist:
grep --exclude=vol*.txt "Schwert" *.txt
Wenn wir die Option -R
(dereference-recursive) verwenden, durchsucht grep
ganze Verzeichnisbäume nach uns. Standardmäßig werden alle Dateien an diesen Speicherorten durchsucht. Möglicherweise gibt es mehrere Arten von Dateien, die wir ausschließen möchten.
Unterhalb des aktuellen Verzeichnisses auf diesem Testcomputer befinden sich verschachtelte Verzeichnisse mit Protokolldateien, CSV-Dateien und MD-Dateien. Dies sind alles Arten von Textdateien, die wir ausschließen möchten. Wir könnten für jeden Dateityp eine Option --exclude
verwenden, aber wir können das, was wir wollen, effizienter erreichen, indem wir die Dateitypen gruppieren.
Dieser Befehl schließt alle Dateien mit CSV- oder MD-Erweiterungen sowie alle TXT-Dateien aus, deren Namen entweder mit „vol“ oder „log“ beginnen.
grep -R --exclude=*.{csv,md} --exclude={vol*,log*}.txt "Schwert" /home/dave/data/
Ausgenommen Verzeichnisse
Wenn die Dateien, die wir ignorieren möchten, in Verzeichnissen enthalten sind und es in diesen Verzeichnissen keine Dateien gibt, die wir durchsuchen möchten, können wir diese gesamten Verzeichnisse ausschließen.
Das Konzept ist dem Ausschließen von Dateien sehr ähnlich, außer dass wir die Option --exclude-dir
verwenden und die zu ignorierenden Verzeichnisse benennen.
grep -R --exclude-dir=backup "vorpal" /home/dave/data
Wir haben das Verzeichnis „backup“ ausgeschlossen, durchsuchen aber immer noch ein anderes Verzeichnis namens „backup2“.
Es überrascht nicht, dass wir die Option --exclude-dir
mehrmals in einem einzigen Befehl verwenden können. Beachten Sie, dass der Pfad zu ausgeschlossenen Verzeichnissen relativ zu dem Verzeichnis angegeben werden sollte, in dem die Suche beginnt. Verwenden Sie nicht den absoluten Pfad vom Stammverzeichnis des Dateisystems.
grep -R --exclude-dir=backup --exclude-dir=backup2 "vorpal" /home/dave/data
Wir können auch Gruppierungen verwenden. Das Gleiche können wir prägnanter erreichen mit:
grep -R --exclude-dir={backup,backup2} "vorpal" /home/dave/data
Sie können Datei- und Verzeichnisausschlüsse im selben Befehl kombinieren. Wenn Sie alle Dateien aus einem Verzeichnis ausschließen und bestimmte Dateitypen aus den durchsuchten Verzeichnissen ausschließen möchten, verwenden Sie diese Syntax:
grep -R --exclude=*.{csv,md} --exclude-dir=backup/archive "frumious" /home/dave/data
Manchmal ist es das, was Sie auslassen
Manchmal kann es sich mit grep
anfühlen, als ob Sie versuchen, eine Nadel im Heuhaufen zu finden. Es macht einen großen Unterschied, den Heuhaufen zu entfernen.
VERWANDT: So verwenden Sie reguläre Ausdrücke (Regexes) unter Linux