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

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

Seit 1974 grephilft das Linux-Team Menschen, Zeilen in Dateien zu finden. Aber manchmal grepzu vorsichtig. Hier sind einige Möglichkeiten zu sagen grep, verschiedene Dinge zu ignorieren.

grep-Befehl

Der Befehl grepdurchsucht Textdateien nach Zeilen, die den in der Befehlszeile angegebenen Suchmustern entsprechen. Die Stärke grepliegt in der Verwendung regulärer Ausdrücke. Sie ermöglichen es Ihnen, zu beschreiben, wonach Sie suchen, anstatt es explizit zu definieren.

Geburt grepvor Linux. es wurde in den frühen 1970er Jahren für Unix entwickelt. Seinen Namen hat es von der g/re/p-Tastenfolge im edZeileneditor (übrigens „ee-dee“ ausgesprochen). Dies bedeutete eine weltweite, regelmäßige Expresssuche, die übereinstimmende Zeilen druckte.

grepbekannt – 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, grepkö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 -vOption (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 -eOption (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 -EOption (erweiterte reguläre Ausdrücke) verwenden, können wir Suchmuster mit “ |“ kombinieren, was in diesem Zusammenhang keinen Kanal anzeigt, sondern ein logischer OROperator 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, grepin 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 --excludeOption. 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 -ROption (dereference-recursive) verwenden, grepdurchsucht 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 --excludeParameter 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-dirParameter 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-dirOption 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

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert