Der Name Griff kommt vom ed (und vim) Befehl g/re/p, was bedeutet, dass global nach einem bestimmten regulären Ausdruck gesucht und die Ausgabe ausgegeben (angezeigt) wird.
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 Griff 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 .
xyz
xyzde
exyzd
dexyz
d?gxyz
xxz
xzz
xz
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:
$Katzemeine Datei
Einfache Suche
Um den Text ‚xyz‘ in der Datei zu finden, führen Sie Folgendes aus:
$Griffxyz myfileVerwenden von Farben
Um Farben anzuzeigen, verwenden Sie –color (ein doppelter Bindestrich) oder erstellen Sie einfach einen Alias. Zum Beispiel:
$Griff --Farbexyz myfileoder
$alias Griff= ’Griff--Farbe'$Griffxyz myfile
Optionen
Gemeinsame Optionen, die mit dem verwendet werden Griff Befehl enthalten:
- -Ich finde alle Zeilen unabhängig des Falls
- -C zählen 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
Zum Beispiel:
$Griff -ichxyz myfile# Text unabhängig von Groß-/Kleinschreibung finden$Griff -NSxyz myfile# Zeilen mit Text zählen
$Griff -inxyz myfile# Zeilennummern anzeigen
Mehrere Dateien erstellen
Bevor Sie versuchen, mehrere Dateien zu durchsuchen, erstellen Sie zunächst mehrere neue Dateien:
$rauswerfenxyz>myfile1$rauswerfen -Undxyz xzz XYZ>myfile2
$rauswerfen -Undxxx yyy>myfile3
$Katzemyfile1
$Katzemyfile2
$Katzemyfile3
Mehrere Dateien durchsuchen
Um mehrere Dateien mit Dateinamen oder einem Platzhalter zu durchsuchen, geben Sie Folgendes ein:
$Griff -NSxyz myfile myfile1 myfile2 myfile3$Griff -inxyz mein*
# Übereinstimmung mit Dateinamen, die mit ‚my‘ beginnen
Übung I
- Zählen Sie zuerst, wie viele Zeilen sich in der Datei /etc/passwd befinden.
- Finden Sie nun alle Vorkommen des Textes wo 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 wo .
- 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 Griff 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 Griff , ich kam 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 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 in gleicher Weise 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 ^:
$Griff‘^xyz’ meine DateiSo finden Sie alle Zeilen, die mit Text mit dem Zeichen $ enden:
$Griff‘xyz$’ meine DateiSo finden Sie Zeilen, die eine Zeichenfolge mit den Zeichen ^ und $ enthalten:
$Griff‘^xyz$’ meine DateiSo finden Sie Zeilen mit dem . um einem beliebigen Zeichen zu entsprechen:
$Griff‘^x.z’ meine DateiUm Zeilen zu finden, die das * verwenden, um 0 oder mehr des vorherigen Ausdrucks zu entsprechen:
$Griff‘^xy*z ’Meine DateiSo finden Sie Zeilen mit .*, die 0 oder mehr eines beliebigen Zeichens entsprechen:
$Griff‘^X.*z ’Meine DateiSo finden Sie Zeilen mit dem um das *-Zeichen zu entkommen:
$Griff‘^X*z ’Meine DateiUm das Zeichen zu finden, verwenden Sie:
$Griff'\' meine DateiAusdruck grep – egrep
Die Griff Der 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 |
Dies extrahiert die Zeilen, die mit root, uucp oder mail beginnen, aus der Datei, das | Symbol, das eine der Optionen bedeutet.
Der folgende Befehl wird nicht funktionieren, obwohl keine Meldung angezeigt wird, da die Basis Griff Befehl unterstützt nicht alle regulären Ausdrücke:
$Griff '(^root|^uucp|^mail)' /etc/passwdAuf den meisten Linux-Systemen ist jedoch der Befehl grep -E ist das gleiche wie verwenden egrep :
$Griff -UND '(^root|^uucp|^mail)' /etc/passwdVerwenden von Filtern
Rohrleitungen ist der Vorgang, bei dem die Ausgabe eines Befehls als Eingabe in einen anderen Befehl gesendet wird und ist eines der leistungsstärksten Linux-Tools, die es gibt.
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 Griff Befehl. Ausgabe aus dem Griff Befehl wird dann als Eingabe an den mehr Befehl.
Dadurch werden nur Verzeichnisse angezeigt in /etc :
$ls -das /etc|Griff'^d'|mehrDie folgenden Befehle sind Beispiele für die Verwendung von Filtern:
$ps -ef|Griffcron $Wer|GriffkdmBeispieldatei
Um die Überprüfungsübung auszuprobieren, erstellen Sie zunächst die folgende Beispieldatei.
Verwenden Sie einen Editor wie nano oder vim, um den unten stehenden Text in eine Datei namens . zu kopieren Personen:
Persönlicher J.Smith 25000Persönlicher E.Smith 25400
Ausbildung A.Braun 27500
Schulung C.Brown 23400
(Admin) R.Bron 30500
Goodsout T.Smyth 30000
Persönlicher F.Jones 25000
Schulung* C.Evans 25500
Goodsout W.Papst 30400
Erdgeschoss T.Smythe 30500
Mitarbeiter J.Maler 33000
Übung II
- Datei anzeigen Personen und begutachten Sie dessen Inhalt.
- Finde alle Zeilen, die die Zeichenfolge enthalten Schmied in der Datei people.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)
- Verwenden 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 als Platzhalter auf Steroiden vorstellen.
Es gibt elf Zeichen mit besonderen Bedeutungen: die öffnenden und schließenden eckigen Klammern [ ], der umgekehrte Schrägstrich , das Caret-Zeichen ^, das Dollarzeichen $, der Punkt oder Punkt ., das senkrechte Strich- oder Pipe-Symbol |, das Fragezeichen ?, das Sternchen oder Stern *, das Pluszeichen + und die öffnende und schließende runde Klammer { }. Diese Sonderzeichen werden oft auch als Metazeichen bezeichnet.
Hier ist der vollständige Satz von Sonderzeichen:
^ | Beginn einer Zeile |
$ | Ende einer Zeile |
. | Beliebiges Zeichen (außer 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 Griff hat nur begrenzte Unterstützung für reguläre Ausdrücke. Damit alle der 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’ myfileZeilen finden mit | um einen der Ausdrücke innerhalb einer Zeichenfolge zu finden, verwenden Sie auch ( ):
$egrep‘^ X(Yz|yz)' meine DateiSo 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 DateiSo suchen Sie mit + nach Zeilen, die einem oder mehreren des vorherigen Ausdrucks entsprechen:
$egrep‘^xy+z’ meine DateiUm Zeilen mit dem ? um 0 oder 1 des vorherigen Ausdrucks zu entsprechen:
$egrep‘^xy?z’ myfileÜ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 Quelle in der Datei Leute.Wenn Sie Zeit haben:
- Suchen Sie die Zeile mit der Zeichenfolge (Administrator), einschließlich der Klammern, in der Datei Personen.
- Suchen Sie die Zeile mit dem Zeichen * in der Datei people.
- Kombinieren Sie 5 und 6 oben, um beide Ausdrücke zu finden.
Mehr Beispiele
Linien finden mit . und * für eine beliebige Zeichenfolge:
$egrep‘^xy.*z ’Meine DateiSo suchen Sie mit { } Zeilen, die mit N Zeichen übereinstimmen:
$egrep‘^xy{3}z ’Meine Datei$egrep‘^xy{4}z ’Meine Datei
Um Zeilen mit { } zu finden, die N oder öfter entsprechen:
$egrep‘^xy{3,}z ’Meine DateiSo finden Sie mit { } Zeilen, die N-mal, aber nicht mehr als M-mal übereinstimmen:
$egrep‘^xy{2,3}z ’Meine DateiAbschluss
In diesem Tutorial haben wir uns zuerst mit der Verwendung von Griff 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, dass Sie die hier gewonnenen Erkenntnisse sinnvoll einsetzen werden. Ausprobieren Griff 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 wir , 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 wo in der Datei /etc/passwd.
$ grep var /etc/passwd
Finden Sie heraus, wie viele Zeilen in der Datei den Text enthalten wo
Finden Sie heraus, wie viele Zeilen den Text NICHT enthalten wo .
Griff -Lebenslaufwo/etc/passwdDen Eintrag für Ihr Login finden Sie im /etc/passwd Datei
grep kdm /etc/passwd
Übung II
Datei anzeigen Personen und begutachten Sie dessen Inhalt.
$ cat people
Finde alle Zeilen, die die Zeichenfolge enthalten Schmied in der Datei Personen .
$ grep 'Smith' people
Erstellen Sie eine neue Datei, nleute , enthält alle Zeilen, die mit der Zeichenfolge beginnen persönlich in dem Personen Datei
$ grep '^Personal' people> npeople
Bestätigen Sie den Inhalt der Datei nleute indem Sie die Datei auflisten.
$ cat npeople
Hängen Sie nun alle Zeilen an, wo der Text endet mit der Zeichenfolge 500 in der Datei Personen zur Datei nleute .
$ grep '500$' people>>npeople
Bestätigen Sie erneut den Inhalt der Datei nleute indem Sie die Datei auflisten.
$ cat npeople
Finden Sie die IP-Adresse des Servers, die in der Datei gespeichert ist /etc/hosts .
$ grep $(hostname) /etc/hosts
Verwenden 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 Personen .
$ egrep 'Evans|Maler' people
Finde alle Zeilen mit den Namen Schmied , Smyth oder Smythe in der Datei Personen .
$ egrep 'Sm(i|y)the?' people
Finde alle Zeilen mit den Namen Braun , Browen oder Quelle in der Datei Leute.
$ egrep 'Brow?e?n' people
Suchen Sie die Zeile mit der Zeichenfolge (Administrator), einschließlich der Klammern, in der Datei Personen .
Suchen Sie die Zeile mit dem Zeichen * in der Datei Leute.
$ egrep '*' people
Kombinieren Sie 5 und 6 oben, um beide Ausdrücke zu finden.