So schließen Sie Muster, Dateien und Verzeichnisse mit grep aus

Veröffentlicht: 2022-06-29
Linux-Laptop mit einer Bash-Eingabeaufforderung
fatmawati achmad zaenuri/Shutterstock.com

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.

So verwenden Sie den grep-Befehl unter Linux
RELATED How to Use the grep Command on Linux

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 

Zwei verschiedene Möglichkeiten, dieselbe Textdatei mit grep zu durchsuchen

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 

Verwenden der invertierten Suchoption -v mit grep

Die Zeilen, die „Jabberwock“ nicht enthalten, werden im Terminalfenster aufgelistet.

Alle Zeilen, die das Wort Jabberwock nicht enthalten

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 

Verwenden mehrerer Suchklauseln mit grep

Es gibt einen entsprechenden Rückgang in der Anzahl der Zeilen in der Ausgabe.

Die Zeilen aus dem Text, die mit keinem der Suchbegriffe übereinstimmen

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 

Verwenden des logischen OR-Operators mit grep

Wir erhalten genau die gleiche Ausgabe wie beim vorherigen, langatmigeren Befehl.

Die Zeilen aus dem Text, die mit keinem der Suchbegriffe übereinstimmen

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 

Ausgenommen Dateien, die mit bestimmten Buchstaben beginnen

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" 

grep in grep leiten, um zweimal zu filtern

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 

Durchsuchen einer Liste benannter Dateien

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 

Verwenden von Platzhaltern zum Durchsuchen einer Sammlung von Dateien

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 

Suche nach „Schwert“ in einer Sammlung von TXT-Dateien

Die gewünschten Ergebnisse werden durch die Flut falscher Ergebnisse aus anderen Dateien mit der Erweiterung TXT überdeckt.

Eine große Ergebnismenge falsch positiver Ergebnisse

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 

Ausschließen von Dateien mit Platzhaltern

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/ 

Verwendung mehrerer --exclude-Klauseln und Dateinamengruppierungen

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 

Ausschließen eines Verzeichnisses von der Suche

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 

Zwei Verzeichnisse von der Suche ausschließen

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 

Ausschließen von Verzeichnissen mit Gruppierung

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 

Ausschließen von Dateitypen und Verzeichnissen im selben Befehl

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