So verwenden Sie den grep-Befehl unter Linux

Veröffentlicht: 2022-01-29
Eine Terminal-Eingabeaufforderung auf einem Linux-PC.
Fatmawati Achmad Zaenuri/Shutterstock

Der Linux-Befehl grep ist ein Dienstprogramm zum Abgleich von Zeichenfolgen und Mustern, das übereinstimmende Zeilen aus mehreren Dateien anzeigt. Es funktioniert auch mit der Piped-Ausgabe von anderen Befehlen. Wir zeigen Ihnen wie.

Die Geschichte hinter grep

Der Befehl grep ist in Linux- und Unix-Kreisen aus drei Gründen berühmt. Erstens ist es enorm nützlich. Zweitens kann die Fülle an Optionen überwältigend sein. Drittens wurde es über Nacht geschrieben, um ein bestimmtes Bedürfnis zu befriedigen. Die ersten beiden sind genau richtig; der dritte ist etwas abseits.

Ken Thompson hatte die Suchfunktionen für reguläre Ausdrücke aus dem ed -Editor (ausgesprochen ee-dee) extrahiert und ein kleines Programm – für seinen eigenen Gebrauch – erstellt, um Textdateien zu durchsuchen. Sein Abteilungsleiter bei Bell Labs, Doug Mcilroy, wandte sich an Thompson und beschrieb das Problem, mit dem einer seiner Kollegen, Lee McMahon, konfrontiert war.

10 grundlegende Linux-Befehle für Anfänger
VERWANDTE 10 grundlegende Linux-Befehle für Anfänger

McMahon versuchte, die Autoren der föderalistischen Papiere durch Textanalyse zu identifizieren. Er brauchte ein Tool, das in Textdateien nach Phrasen und Zeichenfolgen suchen konnte. Thompson verbrachte an diesem Abend ungefähr eine Stunde damit, sein Werkzeug zu einem allgemeinen Dienstprogramm zu machen, das von anderen verwendet werden konnte, und benannte es in grep um. Er entnahm den Namen der ed -Befehlszeichenfolge g/re/p , was übersetzt „globale Suche nach regulären Ausdrücken“ bedeutet.

Sie können Thompson dabei zusehen, wie er mit Brian Kernighan über die Geburt von grep spricht.

Einfache Suche mit grep

Um nach einer Zeichenfolge innerhalb einer Datei zu suchen, übergeben Sie den Suchbegriff und den Dateinamen in der Befehlszeile:

grep dave /etc/password in einem Terminalfenster
Anzeige

Passende Zeilen werden angezeigt. In diesem Fall handelt es sich um eine einzelne Zeile. Der übereinstimmende Text wird hervorgehoben. Dies liegt daran, dass grep auf den meisten Distributionen als Alias ​​verwendet wird:

 alias grep='grep --colour=auto'

Sehen wir uns die Ergebnisse an, bei denen mehrere Zeilen übereinstimmen. Wir suchen in einer Anwendungsprotokolldatei nach dem Wort „Average“. Da wir uns nicht erinnern können, ob das Wort in der Protokolldatei in Kleinbuchstaben geschrieben ist, verwenden wir die Option -i (Groß-/Kleinschreibung ignorieren):

 grep -i Durchschnitt geek-1.log 

Jede übereinstimmende Zeile wird angezeigt, wobei der übereinstimmende Text in jeder Zeile hervorgehoben ist.

Wir können die nicht übereinstimmenden Zeilen anzeigen, indem wir die Option -v (invert match) verwenden.

 grep -v Speicher geek-1.log 

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

Anzeige

Wir können grep dazu bringen, völlig still zu sein. Das Ergebnis wird als Rückgabewert von grep an die Shell übergeben. Ein Ergebnis von Null bedeutet, dass die Zeichenfolge gefunden wurde , und ein Ergebnis von Eins bedeutet, dass sie nicht gefunden wurde . Wir können den Rückkehrcode mit dem $? spezielle Parameter:

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

Rekursive Suche mit grep

Um verschachtelte Verzeichnisse und Unterverzeichnisse zu durchsuchen, verwenden Sie die Option -r (rekursiv). Beachten Sie, dass Sie in der Befehlszeile keinen Dateinamen angeben, sondern einen Pfad angeben müssen. 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 dazu bringen, symbolischen Links zu folgen, indem wir die Option -R (rekursive Dereferenzierung) verwenden. Wir haben in diesem Verzeichnis einen symbolischen Link namens logs-folder . Es zeigt auf /home/dave/logs .

 ls -l Protokollordner 

Wiederholen wir unsere letzte Suche mit der Option -R (rekursive Dereferenzierung):

 grep -R -i memfree . 

Dem symbolischen Link wird gefolgt und das Verzeichnis, auf das er zeigt, wird ebenfalls von grep durchsucht.

Suche nach ganzen Wörtern

Standardmäßig grep mit einer Zeile überein, wenn das Suchziel irgendwo in dieser Zeile erscheint, einschließlich innerhalb einer anderen Zeichenfolge. Sehen Sie sich dieses Beispiel an. Wir werden nach dem Wort „kostenlos“ suchen.

 grep -i free geek-1.log 

Anzeige

Das Ergebnis sind Zeilen, die die Zeichenfolge „free“ enthalten, aber keine separaten Wörter sind. Sie sind Teil der Zeichenfolge „MemFree“.

Um grep zu zwingen, nur einzelne „Wörter“ abzugleichen, verwenden Sie die Option -w (regulärer Ausdruck für Wörter).

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

Diesmal gibt es keine Ergebnisse, weil der Suchbegriff „kostenlos“ in der Datei nicht als eigenes Wort auftaucht.

Verwendung mehrerer Suchbegriffe

Mit der Option -E (erweiterter regulärer Ausdruck) können Sie nach mehreren Wörtern suchen. (Die Option -E ersetzt die veraltete egrep Version von grep .)

Dieser Befehl sucht nach zwei Suchbegriffen, „Average“ und „Memfree“.

 grep -E -w -i "durchschnittlich|speicherfrei" geek-1.log 

Anzeige

Zu jedem Suchbegriff werden alle passenden Zeilen angezeigt.

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

Mit der Option -e (Muster) können Sie mehrere Suchbegriffe in der Befehlszeile verwenden. Wir verwenden die Klammerfunktion für reguläre Ausdrücke, um ein Suchmuster zu erstellen. Es weist grep an, eines der Zeichen zu finden, die in den Klammern „[]“ enthalten sind. Das bedeutet, dass grep bei der Suche entweder „kB“ oder „KB“ findet.

Beide Zeichenfolgen werden abgeglichen, und tatsächlich enthalten einige Zeilen beide Zeichenfolgen.

Genau passende Linien

Das -x (line regexp) findet nur Zeilen, in denen die gesamte Zeile mit dem Suchbegriff übereinstimmt. Suchen wir nach einem Datums- und 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 passende einzelne Zeile wird gefunden und angezeigt.

Das Gegenteil davon zeigt nur die Zeilen an, die nicht übereinstimmen. Dies kann nützlich sein, wenn Sie sich Konfigurationsdateien ansehen. Kommentare sind großartig, aber manchmal ist es schwierig, die tatsächlichen Einstellungen unter ihnen allen zu erkennen. Hier ist die Datei /etc/sudoers :

Anzeige

Wir können die Kommentarzeilen wie folgt effektiv herausfiltern:

 sudo grep -v "#" /etc/sudoers 

Das ist viel einfacher zu analysieren.

Nur übereinstimmenden Text anzeigen

Es kann vorkommen, dass Sie nicht die gesamte übereinstimmende Zeile sehen möchten, sondern nur den übereinstimmenden Text. Die Option -o (only matching) tut genau das.

 grep -o MemFree geek-1.log 

Die Anzeige wird darauf reduziert, nur den Text anzuzeigen, der zum Suchbegriff passt, anstatt die gesamte passende Zeile.

Zählen mit grep

grep geht es nicht nur um Text, es kann auch numerische Informationen liefern. Wir können grep auf verschiedene Weise für uns zählen lassen. Wenn wir wissen wollen, wie oft ein Suchbegriff in einer Datei vorkommt, können wir die Option -c (count) verwenden.

 grep -c Durchschnitt geek-1.log 

grep meldet, dass der Suchbegriff 240 Mal in dieser Datei vorkommt.

Sie können grep veranlassen, die Zeilennummer für jede übereinstimmende Zeile anzuzeigen, indem Sie die Option -n (Zeilennummer) verwenden.

 grep -n Jan geek-1.log 

Anzeige

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

Um die Anzahl der angezeigten Ergebnisse zu reduzieren, verwenden Sie die Option -m (maximale Anzahl). Wir werden die Ausgabe auf fünf übereinstimmende Zeilen beschränken:

 grep -m5 -n Jan geek-1.log 

Kontext hinzufügen

Es ist oft nützlich, einige zusätzliche Zeilen – möglicherweise nicht übereinstimmende Zeilen – für jede übereinstimmende Zeile zu sehen. Es kann helfen, zu unterscheiden, welche der übereinstimmenden Zeilen Sie interessieren.

Um einige Zeilen nach der übereinstimmenden Zeile anzuzeigen, verwenden Sie die Option -A (nach dem Kontext). In diesem Beispiel fragen wir nach drei Zeilen:

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

Um einige Zeilen vor der übereinstimmenden Zeile anzuzeigen, verwenden Sie die Option -B (Kontext davor).

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

Und um Zeilen vor und nach der übereinstimmenden Zeile einzuschließen, verwenden Sie die Option -C (Kontext).

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

Passende Dateien anzeigen

Um die Namen der Dateien anzuzeigen, die den Suchbegriff enthalten, verwenden Sie die Option -l (Dateien mit Übereinstimmung). Um herauszufinden, welche C-Quellcodedateien Verweise auf die Header-Datei sl.h enthalten, verwenden Sie diesen Befehl:

 grep -l "sl.h" *.c 

Die Dateinamen werden aufgelistet, nicht die übereinstimmenden Zeilen.

Anzeige

Und natürlich können wir nach Dateien suchen, die den Suchbegriff nicht enthalten. Die Option -L (Dateien ohne Übereinstimmung) macht genau das.

 grep -L "sl.h" *.c 

Beginn und Ende der Zeilen

Wir können grep zwingen, nur Übereinstimmungen anzuzeigen, die entweder am Anfang oder am Ende einer Zeile stehen. Der reguläre Ausdrucksoperator „^“ entspricht dem Beginn einer Zeile. Praktisch alle Zeilen in der Protokolldatei enthalten Leerzeichen, aber wir werden nach Zeilen suchen, deren erstes Zeichen ein Leerzeichen ist:

 grep "^" geek-1.log 

Die Zeilen, die als erstes Zeichen – am Anfang der Zeile – ein Leerzeichen haben, werden angezeigt.

Um das Ende der Zeile abzugleichen, verwenden Sie den regulären Ausdrucksoperator „$“. Wir werden nach Zeilen suchen, die mit „00“ enden.

 grep "00$" geek-1.log 

Das Display zeigt die Zeilen an, deren letztes Zeichen „00“ ist.

Verwenden von Pipes mit grep

Natürlich können Sie die Eingabe an grep , die Ausgabe von grep an ein anderes Programm weiterleiten und grep in die Mitte einer Pipe-Kette einfügen.

Anzeige

Angenommen, wir möchten alle Vorkommen der Zeichenfolge „ExtractParameters“ in unseren C-Quellcodedateien sehen. Wir wissen, dass es einige geben wird, also leiten wir die Ausgabe an less weiter:

 grep "ExtractParameters" *.c | weniger 

Die Ausgabe wird in less dargestellt.

Damit können Sie durch die Dateiliste blättern und less's Suchfunktion von Less verwenden.

Wenn wir die Ausgabe von grep in wc und die Option -l (Zeilen) verwenden, können wir die Anzahl der Zeilen in den Quellcodedateien zählen, die „ExtractParameters“ enthalten. (Wir könnten dies mit der Option grep -c (count) erreichen, aber dies ist eine nette Möglichkeit, die Weiterleitung von grep zu demonstrieren.)

 grep "ExtractParameters" *.c | WC-l 

Mit dem nächsten Befehl leiten wir die Ausgabe von ls an grep und die Ausgabe von grep an sort weiter. Wir listen die Dateien im aktuellen Verzeichnis auf, wählen diejenigen mit der Zeichenfolge „Aug“ darin aus und sortieren sie nach Dateigröße:

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

Lassen Sie uns das aufschlüsseln:

  • ls -l : Führen Sie mit ls eine Auflistung der Dateien im Langformat durch.
  • grep „Aug“ : Wählen Sie die Zeilen aus der ls Liste aus, die „Aug“ enthalten. Beachten Sie, dass dies auch Dateien finden würde, die „Aug“ in ihrem Namen haben.
  • sort +4n : Sortiert die Ausgabe von grep nach der vierten Spalte (Dateigröße).

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

VERWANDT: So verwenden Sie Pipes unter Linux

grep: Weniger ein Befehl, mehr ein Verbündeter

grep ist ein großartiges Werkzeug, das Sie zur Verfügung haben sollten. Es stammt aus dem Jahr 1974 und läuft immer noch gut, weil wir brauchen, was es tut, und nichts macht es besser.

Die Kopplung von grep mit einigen regulären Ausdrücken-fu bringt es wirklich auf die nächste Stufe.

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

RELATED: Beste Linux-Laptops für Entwickler und Enthusiasten