Der Name grep kommt vom ed (und vim) Befehl „g/re/p“, was bedeutet global nach einem gegebenen regulären Ausdruck suchen und die Ausgabe ausgeben (anzeigen).
Regulär Ausdrücke
Die Dienstprogramme ermöglichen es dem Benutzer, Textdateien nach Zeilen zu durchsuchen, die einem regulären Ausdruck (regexp). Ein regulärer Ausdruck ist eine Suchzeichenfolge, die aus Text und einem oder mehreren von 11 Sonderzeichen besteht. Ein einfaches Beispiel ist das Abgleichen des Anfangs einer Zeile.
Beispieldatei
Die Grundform von grep kann verwendet werden, um einfachen Text in einer oder mehreren bestimmten Dateien zu finden. Um die Beispiele auszuprobieren, erstellen Sie zuerst die Beispieldatei.
Verwenden Sie einen Editor wie nano oder vim, um den unten stehenden Text in eine Datei namens zu kopieren meine Datei.
xyzxyzde
exyzd
dexyz
d?gxyz
xxz
xzz
x\z
x*z
xz
x z
XYZ
XYYZ
xYz
xyyz
xyyyz
xyyyyz
Obwohl Sie die Beispiele kopieren und in den Text einfügen können (beachten Sie, dass doppelte Anführungszeichen möglicherweise nicht richtig kopiert werden), müssen Befehle eingegeben werden, um sie richtig zu lernen.
Bevor Sie die Beispiele ausprobieren, sehen Sie sich die Beispieldatei an:
$ cat myfile
Einfache Suche
Um den Text 'xyz' in der Datei zu finden, führen Sie Folgendes aus:
$ grep xyz myfile
Verwenden von Farben
Um Farben anzuzeigen, verwenden Sie -color (ein doppelter Bindestrich) oder erstellen Sie einfach einen Alias. Beispielsweise:
$ grep --color xyz myfileoder
$ alias grep='grep --color'$ grep xyz myfile
Optionen
Gemeinsame Optionen mit dem grep Befehl enthalten:
- -Ich finde alle Zeilen unabhängig des Falls
- -c Anzahl wie viele Zeilen enthalten den Text
- -n Anzeigezeile Zahlen von passenden Zeilen
- -l nur anzeigen Datei Namen das passt
- -r rekursiv Suche in Unterverzeichnissen
- -v finde alle Zeilen NICHT den Text enthalten
Beispielsweise:
$ grep -i xyz myfile # Text unabhängig von Groß-/Kleinschreibung suchen$ grep -ic xyz myfile # Zeilen mit Text zählen
$ grep -in xyz myfile # Zeilennummern anzeigen
Mehrere Dateien erstellen
Bevor Sie versuchen, mehrere Dateien zu durchsuchen, erstellen Sie zunächst mehrere neue Dateien:
$ echo xyz>myfile1$ echo -e „xyz\nxzz\nXYZ“>meinedatei2
$ echo -e „xxx\nyyy“>meinedatei3
$ cat myfile1
$ cat myfile2
$ cat myfile3
Mehrere Dateien durchsuchen
Um mehrere Dateien mit Dateinamen oder einem Platzhalter zu durchsuchen, geben Sie Folgendes ein:
$ grep -ic xyz myfile myfile1 myfile2 myfile3$ grep -in xyz my*
# Übereinstimmung mit Dateinamen, die mit 'my' beginnen
Übung I
- Zählen Sie zuerst, wie viele Zeilen sich in der Datei /etc/passwd befinden.
- Finde jetzt alle Vorkommen des Textes var in der Datei /etc/passwd.
- Finden Sie heraus, wie viele Zeilen in der Datei den Text enthalten
- Finden Sie heraus, wie viele Zeilen den Text NICHT enthalten var.
- Den Eintrag für Ihr Login finden Sie im /etc/passwd
Übungslösungen finden Sie am Ende dieses Artikels.
Reguläre Ausdrücke verwenden
Der Befehl grep kann auch mit regulären Ausdrücken verwendet werden, indem eines oder mehrere von elf Sonderzeichen oder Symbolen verwendet werden, um die Suche zu verfeinern. Ein regulärer Ausdruck ist eine Zeichenfolge, die Sonderzeichen enthält, um einen Mustervergleich innerhalb von Dienstprogrammen zu ermöglichen, wie z grep, vim und sed. Beachten Sie, dass die Zeichenfolgen möglicherweise in Anführungszeichen eingeschlossen werden müssen.
Zu den verfügbaren Sonderzeichen gehören:
^ | Beginn einer Zeile |
$ | Ende einer Zeile |
. | Beliebiges Zeichen (außer \n Zeilenumbruch) |
* | 0 oder mehr des vorherigen Ausdrucks |
\ | Das Voranstellen eines Symbols macht es zu einem wörtlichen Zeichen |
Beachten Sie, dass das *, das in der Befehlszeile verwendet werden kann, um eine beliebige Anzahl von Zeichen (einschließlich keinem) zu finden, ist nicht hier gleich verwendet.
Beachten Sie auch die Verwendung von Anführungszeichen in den folgenden Beispielen.
Beispiele
Um alle Zeilen zu finden, die mit Text beginnen, verwenden Sie das Zeichen ^:
$ grep '^xyz' meine DateiSo finden Sie alle Zeilen, die mit Text mit dem Zeichen $ enden:
$ grep 'xyz$' meine DateiSo suchen Sie nach Zeilen, die eine Zeichenfolge mit den Zeichen ^ und $ enthalten:
$ grep '^xyz$' meine DateiSo finden Sie Zeilen mit dem . um einem beliebigen Zeichen zu entsprechen:
$ grep '^x.z' meine Datei
Um Zeilen zu finden, die das * verwenden, um 0 oder mehr des vorherigen Ausdrucks zu entsprechen:
$ grep '^xy*z' meine DateiUm Linien zu finden mit .* um 0 oder mehr eines beliebigen Zeichens zu entsprechen:
$ grep '^x.*z' meine DateiSo finden Sie Zeilen mit dem \ um das *-Zeichen zu entkommen:
$ grep '^x\*z' meine DateiUm das Zeichen \ zu finden, verwenden Sie:
$ grep '\\' meine Datei
Ausdruck grep - egrep
Das grep Befehl unterstützt nur eine Teilmenge der verfügbaren regulären Ausdrücke. Allerdings ist der Befehl egrep:
- ermöglicht die volle Nutzung aller regulären Ausdrücke
- kann gleichzeitig nach mehr als einem Ausdruck suchen
Beachten Sie, dass die Ausdrücke in Anführungszeichen eingeschlossen werden müssen.
Um Farben zu verwenden, verwenden Sie -color oder erstellen Sie erneut einen Alias:
$ alias egrep='egrep --color'Um nach mehr als einem zu suchen regex das egrep Befehl kann über mehrere Zeilen geschrieben werden. Dies kann jedoch auch mit diesen Sonderzeichen erfolgen:
| | Abwechslung, entweder das eine oder das andere |
(…) | Logische Gruppierung eines Teils eines Ausdrucks |
Dadurch werden die Zeilen, die mit root, uucp oder mail beginnen, aus der Datei extrahiert, das | Symbol bedeutet eine der Optionen.
Der folgende Befehl wird nicht funktionieren, obwohl keine Meldung angezeigt wird, da die Basis grep Befehl unterstützt nicht alle regulären Ausdrücke:
$ grep '(^root|^uucp|^mail)' /etc/passwdAuf den meisten Linux-Systemen ist jedoch der Befehl grep -E ist das gleiche wie verwenden egrep:
$ grep -E '(^root|^uucp|^mail)' /etc/passwd
Verwenden von Filtern
Rohrleitungen ist der Vorgang, bei dem die Ausgabe eines Befehls als Eingabe in einen anderen Befehl gesendet wird und ist eines der mächtigsten verfügbaren Linux-Tools.
Befehle, die in einer Pipeline erscheinen, werden oft als Filter bezeichnet, da sie in vielen Fällen die an sie übergebene Eingabe durchsuchen oder ändern, bevor sie den geänderten Stream an die Standardausgabe senden.
Im folgenden Beispiel wird die Standardausgabe von ls -l wird als Standardeingabe an die . übergeben grep Befehl. Ausgabe aus dem grep Befehl wird dann als Eingabe an den Mehr Befehl.
Dadurch werden nur Verzeichnisse angezeigt in /usw:
$ ls -l /etc|grep '^d'|more
Die folgenden Befehle sind Beispiele für die Verwendung von Filtern:
$ ps -ef|grep cron$ who|grep kdm
Beispieldatei
Um die Überprüfungsübung auszuprobieren, erstellen Sie zunächst die folgende Beispieldatei.
Verwenden Sie einen Editor wie nano oder vim, um den folgenden Text in eine Datei namens file zu kopieren Menschen:
Persönlich J.Schmied 25000Persönlich E.Schmied 25400
Schulung A.Braun 27500
Schulung C.Braun 23400
(Administrator) R.Bron 30500
Warenausgang T.Smyth 30000
Persönlich F.Jones 25000
Schulung* C.Evans 25500
Warenausgang W.Papst 30400
Erdgeschoss T.Smythe 30500
Persönlich J.Maler 33000
Übung II
- Datei anzeigen Menschen und den Inhalt prüfen its.
- Finde alle Zeilen, die die Zeichenfolge enthalten Schmied in der Datei Leute.Hinweis: Verwenden Sie den Befehl grep, aber denken Sie daran, dass standardmäßig die Groß-/Kleinschreibung beachtet wird.
- Erstellen Sie eine neue Datei, npeople, die alle Zeilen enthält, die mit der Zeichenfolge beginnen persönlich in der Personendatei.Hinweis: Verwenden Sie den Befehl grep mit >.
- Bestätigen Sie den Inhalt der Datei npeople, indem Sie die Datei auflisten.
- Hängen Sie nun alle Zeilen an, wo der Text endet mit der Zeichenfolge 500 in der Datei people in die Datei npeople.Hinweis: Verwenden Sie den Befehl grep mit >>.
- Bestätigen Sie erneut den Inhalt der Datei npeople, indem Sie die Datei auflisten.
- Finden Sie die IP-Adresse des Servers, die in der Datei gespeichert ist /etc/hosts.Hinweis: Verwenden Sie den Befehl grep mit $(hostname)
- Benutzen egrep aus dem herausziehen /etc/passwd Dateikontozeilen mit lp oder deine eigene Benutzeridentifikation.
Übungslösungen finden Sie am Ende dieses Artikels.
Weitere reguläre Ausdrücke
Ein regulärer Ausdruck kann man sich bei Steroiden als Platzhalter vorstellen.
Es gibt elf Zeichen mit besonderen Bedeutungen: die öffnenden und schließenden eckigen Klammern [ ], der Backslash \, das Caret ^, das Dollarzeichen $, der Punkt oder Punkt ., der vertikale Balken oder das Pipe-Symbol |, das Fragezeichen ?, das Sternchen oder Stern *, das Pluszeichen + und die öffnende und schließende runde Klammer . Diese Sonderzeichen werden oft auch Metazeichen genannt.
Hier ist der vollständige Satz von Sonderzeichen:
^ | Beginn einer Zeile |
$ | Ende einer Zeile |
. | Beliebiges Zeichen (außer \n Zeilenumbruch) |
* | 0 oder mehr des vorherigen Ausdrucks |
| | Abwechslung, entweder das eine oder das andere |
[…] | Expliziter Zeichensatz zum Abgleichen |
+ | 1 oder mehr des vorherigen Ausdrucks |
? | 0 oder 1 des vorherigen Ausdrucks |
\ | Das Voranstellen eines Symbols macht es zu einem wörtlichen Zeichen |
… | Explizite Quantorennotation |
(…) | Logische Gruppierung eines Teils eines Ausdrucks |
Die Standardversion von grep hat nur begrenzte Unterstützung für reguläre Ausdrücke. Damit alle folgenden Beispiele funktionieren, verwenden Sie egrep stattdessen oder grep -E.
So finden Sie Zeilen mit dem | um einen der Ausdrücke zu entsprechen:
$ egrep 'xxz|xzz' meine DateiZeilen finden mit | Um einen der Ausdrücke innerhalb einer Zeichenfolge zu finden, verwenden Sie auch ( ):
$ egrep '^x(Yz|yz)' meine Datei
So finden Sie mit [ ] Zeilen, die einem beliebigen Zeichen entsprechen:
$ egrep '^x[Yy]z' meine DateiSo suchen Sie mit [ ] Zeilen, die KEINE Zeichen enthalten:
$ egrep '^x[^Yy]z' meine DateiUm Zeilen zu finden, die das * verwenden, um 0 oder mehr des vorherigen Ausdrucks zu entsprechen:
$ egrep '^xy*z' meine Datei
So suchen Sie mit + nach Zeilen, die einem oder mehreren des vorherigen Ausdrucks entsprechen:
$ egrep '^xy+z' meine DateiSo finden Sie Zeilen mit dem ? um 0 oder 1 des vorherigen Ausdrucks zu entsprechen:
$ egrep '^xy?z' meine Datei
Übung III
- Finde alle Zeilen mit den Namen Evans oder Maler in der Datei Leute.
- Finde alle Zeilen mit den Namen Smith, Smith oder Smythe in der Datei Leute.
- Finde alle Zeilen mit den Namen Brown, Brown oder Bron in der Datei Leute.Wenn du Zeit hast:
- Suchen Sie die Zeile mit der Zeichenfolge (Administrator), einschließlich der Klammern, in der Datei Leute.
- Suchen Sie die Zeile mit dem Zeichen * in der Datei people.
- Kombiniere 5 und 6 oben, um beide Ausdrücke zu finden.
Mehr Beispiele
Um Linien zu finden mit . und * für eine beliebige Zeichenfolge:
$ egrep '^xy.*z' meine DateiSo finden Sie mit Zeilen, die mit N Zeichen übereinstimmen:
$ egrep '^xy3z' meine Datei$ egrep '^xy4z' meine Datei
So finden Sie mit Zeilen, die N oder öfter entsprechen:
$ egrep '^xy3,z' meine DateiSo finden Sie mit Zeilen, die N-mal, aber nicht mehr als M-mal übereinstimmen:
$ egrep '^xy2,3z' meine Datei
Fazit
In diesem Tutorial haben wir uns zuerst mit der Verwendung von grep in seiner einfachen Form, um Text in einer Datei oder in mehreren Dateien zu finden. Den zu suchenden Text haben wir dann mit einfachen regulären Ausdrücken kombiniert und dann mit komplexeren mit egrep.
Nächste Schritte
Ich hoffe, Sie werden das hier gewonnene Wissen gut nutzen. Ausprobieren grep Befehle auf Ihre eigenen Daten und denken Sie daran, reguläre Ausdrücke wie hier beschrieben können in der gleichen Form verwendet werden in vi, sed und awk!
Übungslösungen
Übung I
Zählen Sie zuerst, wie viele Zeilen die Datei enthält /etc/passwd.$ wc -l /etc/passwd
Finden Sie nun alle Vorkommen des Textes var in der Datei /etc/passwd.$ grep var /etc/passwd
Finden Sie heraus, wie viele Zeilen in der Datei den Text enthalten var
Finden Sie heraus, wie viele Zeilen den Text NICHT enthalten var.
grep -cv var /etc/passwdDen Eintrag für Ihr Login finden Sie im /etc/passwd Dateigrep kdm /etc/passwd
Übung II
Datei anzeigen Menschen und den Inhalt prüfen its.$ Katzenmenschen
Finde alle Zeilen, die die Zeichenfolge enthalten Schmied in der Datei Menschen.$ grep 'Smith' Leute
Erstellen Sie eine neue Datei, nleute, enthält alle Zeilen, die mit der Zeichenfolge beginnen persönlich in dem Menschen Datei$ grep '^Persönliche' Leute> nMenschen
Bestätigen Sie den Inhalt der Datei nleute indem Sie die Datei auflisten.$ Katze npeople
Hängen Sie nun alle Zeilen an, wo der Text endet mit der Zeichenfolge 500 in der Datei Menschen zur Datei nleute.$ grep '500$' Leute>>nLeute
Bestätigen Sie erneut den Inhalt der Datei nleute indem Sie die Datei auflisten.$ Katze npeople
Finden Sie die IP-Adresse des Servers, die in der Datei gespeichert ist /etc/hosts.$ grep $(Hostname) /etc/hosts
Benutzen egrep aus dem herausziehen /etc/passwd Dateikontozeilen mit lp oder Ihre eigene Benutzerkennung.$ egrep '(lp|kdm:)' /etc/passwd
Übung III
Finde alle Zeilen mit den Namen Evans oder Maler in der Datei Menschen.$ egrep 'Evans|Maler' Leute
Finde alle Zeilen mit den Namen Schmied, Smyth oder Smythe in der Datei Menschen.$ egrep 'Sm(i|y)the?' Menschen
Finde alle Zeilen mit den Namen Braun, Browen oder Bron in der Datei Leute.$ egrep 'Brauen?e?n' Leute
Suchen Sie die Zeile mit der Zeichenfolge (Administrator), einschließlich der Klammern, in der Datei Menschen.
Suchen Sie die Zeile mit dem Zeichen * in der Datei Leute.$ egrep '\*' Leute
Kombiniere 5 und 6 oben, um beide Ausdrücke zu finden.