Verwendung des Befehls grep unter Linux

Der Linux- grepBefehl ist ein Dienstprogramm zum Abgleichen von Zeichenfolgen und Mustern, mit dem übereinstimmende Zeilen aus mehreren Dateien angezeigt werden. Es funktioniert auch mit der Pipeline-Ausgabe anderer Befehle. Wir zeigen Ihnen wie.

Die Geschichte hinter grep

Der grepBefehl ist in Linux- und Unix-Kreisen aus drei Gründen bekannt. 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 angeschlagen; der dritte ist etwas aus.

Ken Thompson hatte die Suchfunktionen für reguläre Ausdrücke aus dem edEditor (ausgesprochen ee-dee) extrahiert und ein kleines Programm für seinen eigenen Gebrauch zum Durchsuchen von Textdateien erstellt. Sein Abteilungsleiter bei Bell Labs, Doug Mcilroy, trat an Thompson heran und beschrieb das Problem, mit dem einer seiner Kollegen, Lee McMahon, konfrontiert war.

McMahon versuchte, die Autoren der föderalistischen Papiere durch Textanalyse zu identifizieren. Er brauchte ein Werkzeug, mit dem er 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 um grep. Er nahm den Namen von der edBefehlszeichenfolge g/re/p, die als "globale Suche nach regulären Ausdrücken" übersetzt wird.

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

Einfache Suche mit grep

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

Übereinstimmende Linien werden angezeigt. In diesem Fall handelt es sich um eine einzelne Zeile. Der passende Text wird hervorgehoben. Dies liegt daran, dass bei den meisten Distributionen grepein Alias ​​vorliegt für:

alias grep = "grep --colour = auto"

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

grep -i Durchschnittlicher Geek-1.log

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

Wir können die nicht übereinstimmenden Linien mit der Option -v (Invert Match) anzeigen.

grep -v Mem geek-1.log

Es erfolgt keine Hervorhebung, da dies die nicht übereinstimmenden Linien sind.

Wir können dazu führen grep, dass wir völlig schweigen. Das Ergebnis wird als Rückgabewert von an die Shell übergeben grep. Ein Ergebnis von Null bedeutet , die Schnur wurde gefunden, und ein Ergebnis einer apparativen es wurde nicht gefunden. Wir können den Rückkehrcode mit den $?speziellen Parametern überprüfen  :

grep -q durchschnittlicher geek-1.log
echo $?
grep -q howtogeek geek-1.log
echo $?

Rekursive Suche mit grep

Verwenden Sie die Option -r (rekursiv), um verschachtelte Verzeichnisse und Unterverzeichnisse zu durchsuchen. 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.

grep  Mit der -ROption (rekursive Dereferenzierung) können wir  symbolischen Links folgen . Wir haben einen symbolischen Link in diesem Verzeichnis, genannt logs-folder. Es zeigt auf /home/dave/logs.

ls -l Protokollordner

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

grep -R -i memfree.

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

Suche nach ganzen Wörtern

Standardmäßig grepstimmt eine Zeile überein, wenn das Suchziel an einer beliebigen Stelle in dieser Zeile angezeigt wird, auch in einer anderen Zeichenfolge. Schauen Sie sich dieses Beispiel an. Wir werden nach dem Wort "frei" suchen.

grep -i free geek-1.log

Das Ergebnis sind Zeilen mit der Zeichenfolge "frei", aber keine separaten Wörter. Sie sind Teil der Zeichenfolge "MemFree".

grep Verwenden Sie die -wOption (word regexp) , um zu erzwingen , dass nur separate „Wörter“ übereinstimmen.

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

Diesmal gibt es keine Ergebnisse, da der Suchbegriff "frei" nicht als separates Wort in der Datei angezeigt wird.

Verwenden mehrerer Suchbegriffe

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

Dieser Befehl sucht nach zwei Suchbegriffen, "Durchschnitt" und "memfree".

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

Alle übereinstimmenden Zeilen werden für jeden Suchbegriff angezeigt.

Sie können auch nach mehreren Begriffen suchen, bei denen es sich nicht unbedingt um ganze Wörter handelt, sondern auch um ganze Wörter.

Mit der -eOption (Muster) können Sie mehrere Suchbegriffe in der Befehlszeile verwenden. Wir verwenden die Funktion für Klammern für reguläre Ausdrücke, um ein Suchmuster zu erstellen. Es weist grepan, mit einem der in den Klammern "[]" enthaltenen Zeichen übereinzustimmen. Dies bedeutet, grepdass bei der Suche entweder "kB" oder "KB" übereinstimmt.

Beide Zeichenfolgen stimmen überein, und tatsächlich enthalten einige Zeilen beide Zeichenfolgen.

Genau übereinstimmende Linien

Der  -x(Zeilenregexp) stimmt nur mit Zeilen überein, bei 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 erscheint:

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

Die übereinstimmende einzelne Zeile wird gefunden und angezeigt.

Das Gegenteil davon zeigt nur die Linien, 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 allen zu erkennen. Hier ist die /etc/sudoersDatei:

Wir können die Kommentarzeilen wie folgt effektiv herausfiltern:

sudo grep -v "#" / etc / sudoers

Das ist viel einfacher zu analysieren.

Nur passenden Text anzeigen

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

grep -o MemFree geek-1.log

In der Anzeige wird nur der Text angezeigt, der dem Suchbegriff entspricht, und nicht die gesamte übereinstimmende Zeile.

Mit grep zählen

grepEs geht nicht nur um Text, sondern kann auch numerische Informationen liefern. Wir können grepauf verschiedene Weise für uns zählen. Wenn wir wissen möchten, wie oft ein Suchbegriff in einer Datei vorkommt, können wir die -cOption (count) verwenden.

grep -c durchschnittlicher geek-1.log

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

grepMit der -nOption (Zeilennummer) können Sie die Zeilennummer für jede übereinstimmende Zeile anzeigen lassen .

grep -n Jan geek-1.log

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

Verwenden Sie die -mOption (maximale Anzahl), um die Anzahl der angezeigten Ergebnisse zu verringern . 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. Dies kann Ihnen dabei helfen, zu erkennen, an welchen der übereinstimmenden Linien Sie interessiert sind.

Verwenden Sie die Option -A (nach Kontext), um einige Zeilen nach der übereinstimmenden Zeile anzuzeigen. In diesem Beispiel werden drei Zeilen angefordert:

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

Verwenden Sie die -BOption (Kontext vor) , um einige Zeilen vor der übereinstimmenden Zeile anzuzeigen.

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

Verwenden Sie die -COption (Kontext) , um Zeilen vor und nach der übereinstimmenden Zeile einzuschließen.

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

Übereinstimmende Dateien anzeigen

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

grep -l "sl.h" * .c

Die Dateinamen werden aufgelistet, nicht die übereinstimmenden Zeilen.

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

grep -L "sl.h" * .c

Anfang und Ende der Zeilen

Wir können erzwingen grep, nur Übereinstimmungen anzuzeigen, die entweder am Anfang oder am Ende einer Zeile stehen. Der Operator für reguläre Ausdrücke "^" entspricht dem Zeilenanfang. Praktisch alle Zeilen in der Protokolldatei enthalten Leerzeichen, aber wir werden nach Zeilen suchen, deren erstes Zeichen ein Leerzeichen enthält:

grep "^" geek-1.log

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

Verwenden Sie den Operator für reguläre Ausdrücke "$", um das Zeilenende abzugleichen. Wir werden nach Zeilen suchen, die mit "00" enden.

grep "00 $" geek-1.log

Das Display zeigt die Zeilen an, deren letzte Zeichen „00“ sind.

Verwenden von Pipes mit grep

Natürlich können Sie Eingaben an ein anderes Programm grepweiterleiten, die Ausgabe an ein grepanderes Programm grepweiterleiten und sich in die Mitte einer Rohrkette eingebettet haben .

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:

grep "ExtractParameters" * .c | weniger

Die Ausgabe wird in dargestellt less.

Auf diese Weise können Sie durch die Dateiliste blättern und die less'sSuchfunktion verwenden.

Wenn wir die Ausgabe von grepin weiterleiten wcund die -lOption (Zeilen) verwenden, können wir die Anzahl der Zeilen in den Quellcodedateien zählen, die "ExtractParameters" enthalten. (Wir könnten dies mit der grep-cOption (count) erreichen, aber dies ist eine gute Möglichkeit, das Herausführen von Rohrleitungen zu demonstrieren grep.)

grep "ExtractParameters" * .c | wc -l

Mit dem nächsten Befehl leiten wir die Ausgabe von lsin grepund die Ausgabe von grepin weiter sort. Wir listen die Dateien im aktuellen Verzeichnis auf, wählen diejenigen mit der Zeichenfolge "Aug" aus und sortieren sie nach Dateigröße:

ls -l | grep "Aug" | sort + 4n

Lassen Sie uns das zusammenfassen:

  • ls -l : Führen Sie eine Langformatliste der Dateien mit aus ls.
  • grep "Aug" : Wählen Sie die Zeilen aus der lsListe aus, die "Aug" enthalten. Beachten Sie, dass dies auch Dateien finden würde, deren Namen "Aug" enthalten.
  • sort + 4n : Sortiert die Ausgabe von grep in der vierten Spalte (Dateigröße).

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

VERBINDUNG: Verwendung von Pipes unter Linux

grep: Weniger ein Befehl, mehr ein Verbündeter

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

Die Kopplung grepmit einigen regulären Ausdrücken-fu bringt es wirklich auf die nächste Ebene.

VERBINDUNG: Verwendung grundlegender regulärer Ausdrücke, um besser zu suchen und Zeit zu sparen