So schließen Sie Muster, Dateien und Verzeichnisse mit grep aus
Seit 1974 grep
hilft das Linux-Team Menschen, Zeilen in Dateien zu finden. Aber manchmal grep
zu vorsichtig. Hier sind einige Möglichkeiten zu sagen grep
, verschiedene Dinge zu ignorieren.
grep-Befehl
Der Befehl grep
durchsucht Textdateien nach Zeilen, die den in der Befehlszeile angegebenen Suchmustern entsprechen. Die Stärke grep
liegt in der Verwendung regulärer Ausdrücke. Sie ermöglichen es Ihnen, zu beschreiben, wonach Sie suchen, anstatt es explizit zu definieren.
Geburt grep
vor Linux. es wurde in den frühen 1970er Jahren für Unix entwickelt. Seinen Namen hat es von der g/re/p-Tastenfolge im ed
Zeileneditor (übrigens „ee-dee“ ausgesprochen). Dies bedeutete eine weltweite, regelmäßige Expresssuche, die übereinstimmende Zeilen druckte.
grep
bekannt – vielleicht berüchtigt – dafür, gründlich und zielstrebig zu sein. Manchmal sucht es nach Dateien oder Verzeichnissen, mit denen Sie Ihre Zeit lieber nicht verschwenden möchten, da die Ergebnisse es Ihnen unmöglich machen können, den Wald vor lauter Bäumen zu sehen.
Natürlich gibt es Möglichkeiten, grep zu steuern. Sie können es anweisen, Muster, Dateien und Verzeichnisse zu ignorieren, damit grep schneller sucht und Sie nicht mit bedeutungslosen Fehlalarmen überschwemmt werden.
Musterausschluss
Um mit zu suchen, grep
können Sie die Eingabe von einem anderen Prozess, wie z. B. , dorthin leiten cat
, oder Sie können einen Dateinamen als letztes Befehlszeilenargument angeben.
Wir verwenden eine kurze Datei, die den Text des Gedichts Jabberwocky von Lewis Carroll enthält. In diesen beiden Beispielen suchen wir nach Zeichenfolgen, die dem Suchbegriff „jabberwock“ entsprechen.
cat jabberwocky.txt | grep "Jabberwock"
grep "Jabberwock"jabberwocky.text
Zeilen, die Übereinstimmungen mit einem Suchhinweis enthalten, werden für uns aufgelistet, wobei das entsprechende Element in jeder Zeile rot hervorgehoben wird. Dies ist eine Direktsuche. Was aber, wenn wir die Zeilen mit dem Wort „Jabberwock“ ausschließen und den Rest drucken wollen?
Wir können dies mit der -v
Option (invert match) erreichen. Hier werden die Zeichenfolgen aufgelistet, die nicht mit der Suchanfrage übereinstimmen.
grep -v "Jabberwock"jabberwocky.text
Zeilen, die „Jabmaglot“ nicht enthalten, werden im Terminalfenster angezeigt.
Wir können beliebig viele Begriffe ausschließen. Lassen Sie uns alle Zeilen herausfiltern, die „Jabberwock“ enthalten, und alle Zeilen, die „and“ enthalten. Dazu verwenden wir eine -e
Option (Ausdruck). Wir müssen es für jedes Suchmuster verwenden, das wir verwenden.
grep -v -e "Jabberwock"-e "and"jabberwocky.txt
Eine entsprechende Verringerung der Anzahl der Zeilen in der Ausgabe.
Wenn wir die -E
Option (erweiterte reguläre Ausdrücke) verwenden, können wir Suchmuster mit “ |
“ kombinieren, was in diesem Zusammenhang keinen Kanal anzeigt, sondern ein logischer OR
Operator ist.
grep -Ev "Jabberwock|and"jabberwocky.txt
Wir erhalten genau die gleiche Ausgabe wie beim vorherigen, längeren Befehl.
Das Befehlsformat ist dasselbe, wenn Sie anstelle eines expliziten Suchhinweises ein reguläres Ausdrucksmuster verwenden möchten. Dieser Befehl schließt alle Zeilen aus, die mit einem beliebigen Buchstaben aus dem Satz „ACHT“ beginnen.
grep -Ev "^ACHT"jabberwocky.txt
Um Zeilen zu sehen, die ein Muster, aber kein anderes Muster enthalten, können wir grep
übergeben grep
. Wir werden nach allen Zeilen suchen, die das Wort „jabberwock“ enthalten, und dann alle Zeilen herausfiltern, die auch das Wort „killed“ enthalten.
grep "Jabberwock"jabberwocky.txt | grep -v "slain"
Dateiausschluss
Wir können darum bitten, grep
in einer Reihe von Dateien nach einer Zeichenfolge oder einem Muster zu suchen. Sie können jede Datei in der Befehlszeile auflisten, aber bei vielen Dateien lässt sich dieser Ansatz nicht skalieren.
grep "vorpal"verse-1.txt verse-2.txt verse-3.txt verse-4.txt verse-5.txt verse-6.txt
Beachten Sie, dass der Name der Datei, die die übereinstimmende Zeile enthält, am Anfang jeder Ausgabezeile erscheint.
Um die Eingabe zu verkürzen, können wir Wildcards verwenden. Aber das kann kontraintuitiv sein. Es scheint zu funktionieren.
grep "vorpal"*.txt
Es gibt jedoch andere TXT-Dateien in diesem Verzeichnis, die nichts mit dem Gedicht zu tun haben. Wenn wir mit derselben Befehlsstruktur nach dem Wort „Schwert“ suchen, erhalten wir viele Fehlalarme.
grep "sword"*.txt
Die von uns benötigten Ergebnisse werden durch einen Strom falscher Ergebnisse aus anderen TXT-Dateien maskiert.
Das Wort „vorpal“ entsprach nichts, aber das Wort „sword“ ist im Wort „password“ enthalten, sodass es in einigen Pseudo-Log-Dateien häufig vorkam.
Wir müssen diese Dateien ausschließen. Dazu nutzen wir die --exclude
Option. Um eine Datei mit dem Namen „vol-log-1.txt“ auszuschließen, würden wir diesen Befehl verwenden:
grep --exclude=vol-log-1.txt "sword"*.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 "sword"*.txt
Wenn wir die -R
Option (dereference-recursive) verwenden, grep
durchsucht sie alle Verzeichnisbäume nach uns. Standardmäßig sucht es nach allen Dateien an diesen Speicherorten. Möglicherweise gibt es mehrere Arten von Dateien, die wir ausschließen möchten.
Unter dem aktuellen Verzeichnis auf diesem Testcomputer befinden sich Unterverzeichnisse mit Protokolldateien, CSV-Dateien und MD-Dateien. Dies sind alles Arten von Textdateien, die wir ausschließen möchten. Wir könnten einen --exclude
Parameter für jeden Dateityp verwenden, aber wir können das, was wir wollen, effizienter erreichen, indem wir die Dateitypen gruppieren.
Dieser Befehl schließt alle Dateien mit den Erweiterungen .csv oder .md sowie alle .txt-Dateien aus, deren Namen mit „vol“ oder „log“ beginnen.
grep -R --exclude=*.{csv,md} --exclude={vol*,log*}.txt "sword"/home/dave/data/
Ausgenommen Verzeichnisse
Wenn die Dateien, die wir ignorieren möchten, in Verzeichnissen enthalten sind und diese Verzeichnisse nicht die Dateien enthalten, die wir finden möchten, können wir diese Verzeichnisse vollständig ausschließen.
Das Konzept ist dem Ausschließen von Dateien sehr ähnlich, außer dass wir einen --exclude-dir
Parameter verwenden und die zu ignorierenden Verzeichnisse benennen.
grep -R --exclude-dir=backup "vorpal"/home/dave/data
Wir haben das Verzeichnis „backup“ ausgeschlossen, suchen aber immer noch in einem anderen Verzeichnis namens „backup2“.
Es überrascht nicht, dass wir diese --exclude-dir
Option mehrmals im selben Befehl verwenden können. Beachten Sie, dass der Pfad zu den ausgeschlossenen Verzeichnissen relativ zu dem Verzeichnis sein muss, in dem die Suche beginnt. Verwenden Sie keinen absoluten Pfad vom Stammverzeichnis des Dateisystems.
grep -R --exclude-dir=backup --exclude-dir=backup2 "vorpal"/home/dave/data
Wir können auch Gruppierungen verwenden. Wir können das gleiche Ergebnis kürzer erreichen:
grep -R --exclude-dir={backup,backup2} "vorpal"/home/dave/data
Sie können Datei- und Verzeichnisausschlüsse in einem Befehl kombinieren. Wenn Sie alle Dateien aus einem Verzeichnis ausschließen und bestimmte Dateitypen aus Suchverzeichnissen ausschließen möchten, verwenden Sie diese Syntax:
grep -R --exclude=*.{csv,md} --exclude-dir=backup/archive "frumious"/home/dave/data
Schreibe einen Kommentar