Verwendung von grep (und egrep) mit regulären Ausdrücken

Using Grep With Regular Expressions



In diesem Tutorial wird beschrieben, wie Sie beide verwenden Griff (und egrep) t o Text in Dateien finden, in einfacher Form und in Kombination mit regulären Ausdrücken. Es enthält mehrere Beispiele und Übungen , mehr Lösungen , damit der Betrachter vervollständigt.

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 myfile

Verwenden von Farben

Um Farben anzuzeigen, verwenden Sie –color (ein doppelter Bindestrich) oder erstellen Sie einfach einen Alias. Zum Beispiel:

$Griff --Farbexyz myfile

oder

$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

  1. Zählen Sie zuerst, wie viele Zeilen sich in der Datei /etc/passwd befinden.
Hinweis: verwendenToilette -das /etc/passwd
  1. Finden Sie nun alle Vorkommen des Textes wo in der Datei /etc/passwd .
  2. Finden Sie heraus, wie viele Zeilen in der Datei den Text enthalten
  3. Finden Sie heraus, wie viele Zeilen den Text NICHT enthalten wo .
  4. 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 Datei

So finden Sie alle Zeilen, die mit Text mit dem Zeichen $ enden:

$Griff‘xyz$’ meine Datei

So finden Sie Zeilen, die eine Zeichenfolge mit den Zeichen ^ und $ enthalten:

$Griff‘^xyz$’ meine Datei

So finden Sie Zeilen mit dem . um einem beliebigen Zeichen zu entsprechen:

$Griff‘^x.z’ meine Datei

Um Zeilen zu finden, die das * verwenden, um 0 oder mehr des vorherigen Ausdrucks zu entsprechen:

$Griff‘^xy*z ’Meine Datei

So finden Sie Zeilen mit .*, die 0 oder mehr eines beliebigen Zeichens entsprechen:

$Griff‘^X.*z ’Meine Datei

So finden Sie Zeilen mit dem um das *-Zeichen zu entkommen:

$Griff‘^X*z ’Meine Datei

Um das Zeichen zu finden, verwenden Sie:

$Griff'\' meine Datei

Ausdruck 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
$egrep '(^root|^uucp|^mail)' /etc/passwd

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/passwd

Auf den meisten Linux-Systemen ist jedoch der Befehl grep -E ist das gleiche wie verwenden egrep :

$Griff -UND '(^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 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'|mehr

Die folgenden Befehle sind Beispiele für die Verwendung von Filtern:

$ps -ef|Griffcron

$Wer|Griffkdm

Beispieldatei

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 25000
Persö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

  1. Datei anzeigen Personen und begutachten Sie dessen Inhalt.
  2. 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.
  3. 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 >.
  4. Bestätigen Sie den Inhalt der Datei npeople, indem Sie die Datei auflisten.
  5. 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 >>.
  6. Bestätigen Sie erneut den Inhalt der Datei npeople, indem Sie die Datei auflisten.
  7. Finden Sie die IP-Adresse des Servers, die in der Datei gespeichert ist /etc/hosts .Hinweis: Verwenden Sie den Befehl grep mit $(hostname)
  8. 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’ myfile

Zeilen 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 Datei

So suchen Sie mit [ ] Zeilen, die KEINE Zeichen enthalten:

$egrep‘^ X[^ Yy]z ’Meine Datei

Um 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 Datei

Um Zeilen mit dem ? um 0 oder 1 des vorherigen Ausdrucks zu entsprechen:

$egrep‘^xy?z’ myfile

Übung III

  1. Finde alle Zeilen mit den Namen Evans oder Maler in der Datei Leute.
  2. Finde alle Zeilen mit den Namen Smith, Smith oder Smythe in der Datei Leute.
  3. Finde alle Zeilen mit den Namen Brown, Brown oder Quelle in der Datei Leute.Wenn Sie Zeit haben:
  4. Suchen Sie die Zeile mit der Zeichenfolge (Administrator), einschließlich der Klammern, in der Datei Personen.
  5. Suchen Sie die Zeile mit dem Zeichen * in der Datei people.
  6. 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 Datei

So 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 Datei

So finden Sie mit { } Zeilen, die N-mal, aber nicht mehr als M-mal übereinstimmen:

$egrep‘^xy{2,3}z ’Meine Datei

Abschluss

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

Griff -Cwo/etc/passwd

Finden Sie heraus, wie viele Zeilen den Text NICHT enthalten wo .

Griff -Lebenslaufwo/etc/passwd

Den 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 .

$egrep '(Administrator)'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.

$egrep '(Admin)|*'Personen