So verwenden Sie den grep-Befehl unter Linux

Inhalt

Eine Terminal-Eingabeaufforderung auf einem Linux-PC.

El Linux grep Der Befehl ist ein Dienstprogramm zum Abgleichen von Zeichenfolgen und Mustern, das die übereinstimmenden Zeilen aus mehreren Dateien anzeigt. Es funktioniert auch mit Pipeline-Ausgaben von anderen Befehlen. Wir zeigen dir wie.

Die Geschichte hinter grep

das grep Der Befehl ist unter Linux berühmt und Unix Kreise aus drei Gründen. Zuerst, es ist enorm nützlich. An zweiter Stelle, das die schiere anzahl der optionen kann überwältigend sein. An dritter Stelle, wurde über Nacht geschrieben, um ein bestimmtes Bedürfnis zu erfüllen. Die ersten beiden sind sehr gut; der dritte ist etwas daneben.

Ken Thompson ich hatte die extrahiert regulärer Satz Suchfunktionen ed Editor (ausgesprochen ee-dee) und ein kleines Programm erstellt, für Ihren eigenen Gebrauch, um Textdateien zu durchsuchen. Ihr Abteilungsleiter bei Bell Labs, Doug Mcilroy, trat an Thompson heran und beschrieb das Problem einem seiner Kollegen, Lee McMahon, ich stand vor.

McMahon versuchte, die Autoren der Föderalistische Papiere durch Textanalyse. Ich brauchte ein Tool, das in Textdateien nach Phrasen und Zeichenfolgen suchen kann. Thompson verbrachte in dieser Nacht ungefähr eine Stunde damit, sein Werkzeug zu einem allgemeinen Dienstprogramm zu machen, das andere verwenden konnten, und benannte es um grep. Es nahm den Namen des ed Befehlskette g/re/p , was übersetzt bedeutet als “Globale Suche nach regulären Ausdrücken”.

Sie können Thompson sprechen sehen zum Brian Kernighan über die Geburt von grep.

Einfache Suche mit grep

So suchen Sie nach einer Zeichenfolge in einer Datei, Suchbegriff und Dateiname in der Kommandozeile übergeben:

grep dave / etc / Passwort en una Terminal Widnow

Passende Zeilen werden angezeigt. Für diesen Fall, es ist eine einzelne Zeile. Passender Text wird hervorgehoben. Dies liegt daran, dass in den meisten Distributionen grep hat einen Alias ​​für:

Alias ​​grep = 'grep --colour = auto'

Schauen wir uns die Ergebnisse an, bei denen mehrere Zeilen übereinstimmen. Wir werden nach dem Wort suchen “Durchschnitt” in einer Anwendungsprotokolldatei. Weil wir uns nicht erinnern können, ob das Wort in der Protokolldatei klein geschrieben ist, wir werden die benutzen -i (ignoriere Groß- und Kleinbuchstaben) Möglichkeit:

grep -i Durchschnitt geek-1.log

Alle passenden Zeilen werden angezeigt, mit passendem Text markiert auf jedem.

Wir können die Zeilen, die nicht übereinstimmen, mit der Option -v anzeigen (umgekehrtes Spiel).

grep -v Mem geek-1.log

Es gibt keine Hervorhebung, da dies die nicht übereinstimmenden Zeilen sind.

Wir können verursachen grep ganz still sein. Das Ergebnis wird als Rückgabewert von . an die Shell übergeben grep. Ein Ergebnis von Null bedeutet die Zeichenfolge Epoche gefunden, und ein Ergebnis von eins bedeutet, dass war nicht Treffen. Wir können den Rückgabecode mit dem überprüfen $? spezielle Parameter:

grep -q Durchschnitt geek-1.log
Echo $?
grep -q systempeaker geek-1.log
Echo $?

Rekursive Suchen mit grep

So durchsuchen Sie verschachtelte Verzeichnisse und Unterverzeichnisse, Verwenden Sie die Option -r (rekursiv). Beachten Sie, dass Sie in der Befehlszeile keinen Dateinamen angeben, muss einen Weg bieten. Hier suchen wir im aktuellen Verzeichnis “.” und alle Unterverzeichnisse:

grep -r -i memfree .

Die Ausgabe enthält das Verzeichnis und den Dateinamen jeder übereinstimmenden Zeile.

Wir können grep Folgen Sie symbolischen Links mit dem -R (rekursive Dereferenzierung) Möglichkeit. Wir haben einen symbolischen Link in diesem Verzeichnis, namens logs-folder. Zeigen auf /home/dave/logs.

ls -l Protokollordner

Wiederholen wir unsere letzte Suche mit dem -R (rekursive Dereferenzierung) Möglichkeit:

grep -R -i memfree .

Folgen Sie dem symbolischen Link und suchen Sie in dem Verzeichnis, auf das er verweist. grep was ist mehr.

Suche nach ganzen Wörtern

Standard, grep stimmt mit einer Zeile überein, wenn das Suchziel irgendwo in dieser Zeile erscheint, sogar innerhalb einer anderen Zeichenfolge. Schau dir dieses Beispiel an. Lassen Sie uns das Wort nachschlagen “kostenlos”.

grep -i free geek-1.log

Die Ergebnisse sind Zeilen, die die Zeichenfolge anordnen “kostenlos” in ihnen, aber es sind keine getrennten Wörter. Sie sind Teil der Kette “MemFrei”.

Zwingen grep nur übereinstimmend “Wörter” Trennen, Verwenden Sie die -w (Wort regexp) Möglichkeit.

grep -w -i free geek-1.log
Echo $?

Diesmal gibt es keine Ergebnisse, da der Suchbegriff “kostenlos” erscheint in der Datei nicht als separates Wort.

Mehrere Suchbegriffe verwenden

das -E (erweiterter regulärer Ausdruck) ermöglicht die Suche nach mehreren Wörtern. (Die -E Möglichkeit ersetzen Sie das veraltete egrep Version von grep.)

Dieser Befehl sucht nach zwei Suchbegriffen, “Durchschnitt” und “memfrei”.

grep -E -w -i "Durchschnitt|memfrei" geek-1.log

Zu jedem der Suchbegriffe werden alle passenden Zeilen angezeigt.

Sie können auch nach mehreren Begriffen suchen, die nicht unbedingt ganze Wörter sind., aber es können auch ganze Wörter sein.

das -e Die Option (Muster) ermöglicht die Verwendung mehrerer Suchbegriffe in der Befehlszeile. Wir verwenden die Regex-Klammern-Funktion, um ein Suchmuster zu erstellen. Würfel grep Gehen Sie folgendermaßen vor, um einem der Zeichen in eckigen Klammern zu entsprechen “[]. ” Das heisst grep wird bei der Suche mit "kB" oder "KB" übereinstimmen.

Beide Strings stimmen überein und, Genau genommen, einige Zeilen enthalten beide Strings.

Genaue Übereinstimmung der Zeilen

das -x (Zeile regexp) wird nur mit den Zeilen übereinstimmen, in denen die komplette Linie entspricht dem Suchbegriff. Suchen wir nach einem Zeitstempel, von dem wir wissen, dass er nur einmal in der Protokolldatei vorkommt:

grep -x "20-Jan--06 15:24:35" geek-1.log

Die einzige passende Zeile wird gefunden und angezeigt.

Das Gegenteil davon ist, nur die Linien zu zeigen, die Nein Spiel. Dies kann nützlich sein, wenn Sie nach Konfigurationsdateien suchen. Die Kommentare sind toll, aber von Zeit zu Zeit ist es schwierig, die wirkliche Konfiguration zwischen ihnen allen zu identifizieren. Hier ist das /etc/sudoers Verfahren:

Auf diese Weise können wir die Kommentarzeilen effektiv filtern:

sudo grep -v "#" /etc/sudoers

Das ist viel einfacher zu analysieren.

Nur passende Textanzeige

Es kann vorkommen, dass Sie nicht die gesamte übereinstimmende Zeile sehen möchten, nur der passende text. das -o Die Option (nur passen) macht genau das.

grep -o MemFree geek-1.log

Der Bildschirm wird so reduziert, dass nur der Text angezeigt wird, der dem Suchbegriff entspricht, statt der ganzen passenden Zeile.

Zählen auf grep

grep es geht nicht nur um text, es kann auch numerische Informationen liefern. Wir können grep zählt für uns auf unterschiedliche Weise. Wenn wir wissen möchten, wie oft eine Suchdefinition in einer Datei vorkommt, wir können das gebrauchen -c (zählen) Möglichkeit.

grep -c Durchschnitt geek-1.log

grep meldet, dass der Suchbegriff erscheint 240 mal in dieser Datei.

Kannst du tun grep Zeigen Sie die Zeilennummer für jede übereinstimmende Zeile mit den -n Möglichkeit (Zeilennummer).

grep -n Jan geek-1.log

Die Zeilennummer für jede übereinstimmende Zeile wird am Anfang der Zeile angezeigt.

So reduzieren Sie die Anzahl der angezeigten Ergebnisse, Verwenden Sie die -m (maximale Anzahl) Möglichkeit. Wir werden die Ausgabe auf fünf übereinstimmende Zeilen begrenzen:

grep -m5 -n Jan geek-1.log

Kontext hinzufügen

Es ist oft hilfreich, ein paar zusätzliche Zeilen zu sehen, möglicherweise nicht übereinstimmende Zeilen, für jede passende Zeile. kann Ihnen helfen zu unterscheiden, welche der passenden Zeilen die sind, an denen Sie interessiert sind.

Um einige Zeilen nach der passenden Zeile anzuzeigen, Verwenden Sie die Option -A (nach Kontext). Wir fordern in diesem Beispiel drei Zeilen an:

grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log

Um einige Zeilen vor der passenden Zeile zu sehen, benutze el -B (Kontext vorher) Möglichkeit.

grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log

Und Zeilen vor und nach der passenden Zeile einfügen, benutze el -C (Kontext) Möglichkeit.

grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log

Passende Dateien anzeigen

So zeigen Sie die Namen der Dateien an, die den Suchbegriff enthalten, benutze die -l (übereinstimmende Dateien) Möglichkeit. Um herauszufinden, welche C-Quelldateien Verweise auf die sl.h Header-Datei, benutze diesen Befehl:

grep -l "sl.h" *.C

Dateinamen werden aufgelistet, nicht die passenden Zeilen.

UND, entschieden, wir können nach Dateien suchen, die den Suchbegriff nicht enthalten. das -L Die Option (nicht übereinstimmende Dateien) macht genau das.

grep -L "sl.h" *.C

Zeilenanfang und Zeilenende

Wir können erzwingen grep um nur Übereinstimmungen anzuzeigen, die am Anfang oder Ende einer Zeile stehen. Der reguläre Ausdrucksoperator "^" entspricht dem Anfang einer Zeile. Praktisch alle Zeilen in der Protokolldatei enthalten Leerzeichen, aber wir werden nach Zeilen suchen, die ein Leerzeichen als erstes Zeichen haben:

grep "^ " geek-1.log

Die Zeilen mit einem Leerzeichen als erstes Zeichen werden angezeigt, am Anfang der Zeile.

Passend zum Ende der Zeile, Verwenden Sie den Operator für reguläre Ausdrücke “$”. Suchen wir nach Zeilen, die mit “00”.

grep "00$" geek-1.log

Der Bildschirm zeigt die Linien an, die sie haben “00” als Endzeichen.

Verwenden von Pipes mit grep

Entschieden, kann Eingaben trichtern zu grep , Pipe die Ausgabe von grep in einem anderen Programm und haben grep eingebettet in die Mitte einer Rohrkette.

Nehmen wir an, wir wollen alle Erscheinungen der Kette sehen “Parameter extrahieren” in unseren C-Quellcode-Dateien. Wir wissen, dass es einige geben werden, Also kanalisieren wir die Ausgabe zu less:

grep "Parameter extrahieren" *.C | weniger

Die Ausgabe erfolgt in less.

Auf diese Weise können Sie die Liste der Dateien durchsuchen und verwenden less's Suchfunktion.

Wenn wir die Ausgabe von kanalisieren grep innerhalb wc und benutze die -l (Linien) Möglichkeit, uns kann die anzahl der zeilen zählen in den Quellcodedateien, die sie enthalten “Parameter extrahieren”. (Wir könnten dies erreichen, indem wir die grep -c (zählen) Möglichkeit, aber das ist eine schöne Möglichkeit, die Pfeife draußen zu demonstrieren grep.)

grep "Parameter extrahieren" *.C | wc -l

Mit dem folgenden Befehl, wir kanalisieren die Ausgabe von ls innerhalb grep und Kanalisieren der Ausgabe von grep innerhalb sort . Wir listen die Dateien im aktuellen Verzeichnis auf, Auswählen derjenigen mit der Zeichenfolge “August” in ihnen, und nach Dateigröße sortieren:

ls -l | grep "August" | sortieren +4n

Lass uns das analysieren:

  • ls -l: Erstellen Sie eine lange Dateiliste mit ls.
  • grep “August”: Wählen Sie die Zeilen des ls Liste, die Sie haben “August” in ihnen. Beachten Sie, dass dadurch auch Dateien gefunden werden, die “August” in ihren Namen.
  • Auftrag + 4n: Sortieren Sie die Ausgabe von grep in der vierten Spalte ().

Wir erhalten eine geordnete Liste aller im August geänderten Dateien (unabhängig vom Jahr), in aufsteigender Reihenfolge der Dateigröße.

VERBUNDEN: Wie man Pipes unter Linux verwendet

grep: Minus ein Befehl, plus ein Verbündeter

grep ist ein großartiges Werkzeug, das Sie zur Verfügung haben. Auf der 1974 und es steht immer noch stark, weil wir brauchen, was es tut, und nichts macht es besser.

Kupplung grep mit etwas Regex, fu bringt es wirklich auf das nächste Level.

VERBUNDEN: So verwenden Sie einfache reguläre Ausdrücke, um besser zu suchen und Zeit zu sparen

Abonniere unseren Newsletter

Wir senden Ihnen keine SPAM-Mail. Wir hassen es genauso wie du.