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:
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