So verwenden Sie den grep-Befehl unter Linux
Veröffentlicht: 2022-01-29
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.
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:

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.
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
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
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
:
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
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.
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.
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
Linux-Befehle | ||
Dateien | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · konvertieren · rclone · shred · srm | |
Prozesse | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg | |
Vernetzung | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw |
RELATED: Beste Linux-Laptops für Entwickler und Enthusiasten