Verwenden von Grep mit regelmäßigen Ausdrücken

Verwenden von Grep mit regelmäßigen Ausdrücken
In diesem Tutorial wird beschrieben, wie man beide benutzt Grep (Und eGrep) to Suchen Sie Text in Dateien, in ihrer einfachen Form und in Kombination mit regulären Ausdrücken. Es enthält mehrere Beispiele Und Übungen, Plus Lösungen, Damit der Betrachter vervollständigt werden kann.

Der Name Grep stammt aus dem Befehl ED (und VIM) "G/RE/P", was bedeutet, dass die Ausgabe global nach einem bestimmten regulären Ausdruck und Druck (Anzeige) gesucht wird.

Regulär Ausdrücke

Die Dienstprogramme ermöglichen es dem Benutzer, Textdateien nach Zeilen zu durchsuchen, die einem regulären Ausdruck entsprechen (Regexp). Ein regulärer Ausdruck ist eine Suchzeichenfolge aus Text und einer oder mehreren von 11 Sonderzeichen. Ein einfaches Beispiel ist der Start einer Linie.

Beispieldatei

Die grundlegende Form von Grep Kann verwendet werden, um einfachen Text in einer bestimmten Datei oder Dateien zu finden. Um die Beispiele auszuprobieren, erstellen Sie zuerst die Beispieldatei.

Verwenden Sie einen Editor wie Nano oder VIM, um den folgenden Text in eine Datei mit dem Namen zu kopieren meine Datei.

xyz
xyzde
Exyzd
Dexyz
D?gxyz
xxz
xzz
x \ z
x*z
xz
x z
Xyz
Xyyz
xyz
xyyz
xyyyz
xyyyyz

Obwohl Sie die Beispiele im Text kopieren und einfügen können (beachten Sie, dass Doppelzitate möglicherweise nicht ordnungsgemäß kopiert werden) müssen Befehle eingegeben werden, um sie ordnungsgemäß zu lernen.

Bevor Sie die Beispiele ausprobieren, sehen Sie sich die Beispieldatei an:

Katzenmyfile
xyz
xyzde
Exyzd
Dexyz
D?gxyz
xxz
xzz
x \ z
x*z
xz
x z
Xyz
Xyyz
xyz
xyyz
xyyyz
xyyyyz

Einfache Suche

Um den Text 'xyz' in der Datei zu finden, führen Sie Folgendes aus:

Grep xyz myfile
xyz
xyzde
Exyzd
Dexyz
D?gxyz

Optionen

Gemeinsame Optionen mit dem verwendeten Grep Befehl enthalten:

  • -Ich finde alle Zeilen Unabhängig von Fall
  • -C zählen Wie viele Zeilen enthalten den Text
  • -n Anzeigelinie Zahlen von passenden Linien
  • -l nur Anzeige Datei Namen Das Match
  • -R rekursiv Suche nach Unterverzeichnissen
  • -V Finden Sie alle Zeilen NICHT den Text enthalten

Zum Beispiel:

grep -i xyz myfile
# Text unabhängig vom Fall finden
xyz
xyzde
Exyzd
Dexyz
D?gxyz
Xyz
xyz
grep -ic xyz myfile
# Zeilen mit Text zählen
7
grep -in xyz myfile
# Zeilennummern anzeigen
1: xyz
2: xyzde
3: Exyzd
4: Dexyz
5: d?gxyz
12: xyz
14: xyz

Erstellen Sie mehrere Dateien

Erstellen Sie vor dem Versuch, mehrere Dateien zu durchsuchen, zuerst mehrere neue Dateien:

echo xyz> myfile1
Cat MyFile1
xyz
echo -e 'xyz \ nxzz \ nxyz'> myFile2
Cat MyFile2
xyz
xzz
Xyz
echo -e 'xxx \ nyyy'> myfile3
Cat MyFile3
xxx
YJJ

Suchen Sie mehrere Dateien

So durchsuchen Sie mehrere Dateien mithilfe von Dateinamen oder einer Wildcard -Eingabetaste:

grep -ic xyz myfile myfile1 myfile2 myfile3
MyFile: 7
MyFile1: 1
MyFile2: 2
MyFile3: 0
# Übereinstimmung Dateinamen, beginnend mit 'My' '
grep -in xyz mein**
myfile: 1: xyz
myfile: 2: xyzde
MyFile: 3: Exyzd
myfile: 4: dexyz
MyFile: 5: D?gxyz
myfile: 12: xyz
myfile: 14: xyz
MyFile1: 1: xyz
MyFile2: 1: xyz
MyFile2: 3: xyz

Übung i

  1. Zählen Sie zuerst, wie viele Zeilen in der Datei /etc /passwd sind.
Hinweis: Verwenden Sie WC -l /etc /passwd
  1. Finden Sie nun alle Vorkommen des Textes var in der Datei /etc /passwd.
  2. Finden Sie, wie viele Zeilen in der Datei den Text enthalten
  3. Finden Sie heraus, wie viele Zeilen den Text nicht enthalten var.
  4. Finden Sie den Eintrag für Ihr Login in der /etc/passwd

Übungslösungen finden Sie am Ende dieses Artikels.

Verwenden regelmäßiger Ausdrücke

Der Befehl Grep Kann auch mit regulären Ausdrücken verwendet werden, indem ein oder mehrere elf Sonderzeichen oder Symbole verwendet werden, um die Suche zu verfeinern. Ein regulärer Ausdruck ist eine Zeichenzeichenfolge, die Sonderzeichen enthält, um Muster in Dienstprogramme wie z Grep, Vim Und sed. Beachten Sie, dass die Saiten möglicherweise in Zitaten eingeschlossen sein müssen.

Zu den verfügbaren Sonderzeichen gehören:

^ Start einer Linie
$ Ende einer Linie
. Jedes Zeichen (außer \ n Newline)
* 0 oder mehr des vorherigen Ausdrucks
\ Ein Symbol macht es zu einem wörtlichen Charakter

Beachten Sie, dass das *, das in der Befehlszeile verwendet werden kann, um eine beliebige Anzahl von Zeichen zu entsprechen, einschließlich keiner, ist nicht genauso genutzt hier hier.

Beachten Sie auch die Verwendung von Zitaten in den folgenden Beispielen.

Beispiele

So finden Sie alle Zeilen, die mit dem Text mit dem ^ Charakter beginnen:

grep '^xyz' myfile

Um alle Zeilen zu finden, die mit dem Text mit dem $ Charakter enden:

grep 'xyz $' myfile

Um Zeilen zu finden, die eine Zeichenfolge verwenden, die sowohl mit ^ als auch $ $ Zeichen verwendet werden:

grep '^xyz $' myfile

Leitungen mit dem finden . zu jedem Charakter entsprechen:

grep '^x.z 'myfile

Um Zeilen zu finden, die mit dem * 0 oder mehr des vorherigen Ausdrucks übereinstimmen, übereinstimmt:

grep '^xy*z' myfile

Leitungen mit verwenden .* Zu 0 oder mehr von jedem Charakter passt:

grep '^x.*Z 'myfile

Leitungen mit dem finden \ um dem * Charakter zu entkommen:

grep '^x \*z' myfile

Um den \ Character -Gebrauch zu finden:

grep '\\' myfile

Ausdruck Grep - eGrep

Der Grep Der Befehl unterstützt nur eine Teilmenge der verfügbaren regulären Ausdrücke. Der Befehl jedoch EGREP:

  • ermöglicht die volle Verwendung aller regulären Ausdrücke
  • kann gleichzeitig nach mehr als einem Ausdruck suchen

Beachten Sie, dass die Ausdrücke in ein Paar Zitate eingeschlossen sein müssen.

Um nach mehr als einem zu suchen Regex Die Egrep Der Befehl kann über mehrere Zeilen geschrieben werden. Dies kann jedoch auch mit diesen Sonderzeichen erfolgen:

| Wechsel, entweder die eine oder andere
(…) Logische Gruppierung eines Teils eines Ausdrucks
eGrep '(^root |^uucp |^mail)' /etc /passwd

Dies extrahiert die Zeilen, die mit Root, UUCP oder Mail aus der Datei beginnen, die | Symbol bedeutet eine der Optionen.

Der folgende Befehl wird nicht Arbeiten, obwohl keine Nachricht angezeigt wird, da die Basic Grep Der Befehl unterstützt nicht alle regulären Ausdrücke:

grep '(^root |^uucp |^mail)' /etc /passwd

Auf den meisten Linux -Systemen der Befehl jedoch grep -e ist dasselbe wie die Verwendung Egrep:

grep -e '(^root |^uucp |^mail)' /etc /passwd

Verwenden von Filtern

Rohrleitungen ist der Prozess des Sendens der Ausgabe eines Befehls als Eingabe in einen anderen Befehl und ist eines der leistungsstärksten Linux -Tools verfügbar.

Befehle, die in einer Pipeline erscheinen.

Im folgenden Beispiel Standardausgabe von ls -l wird als Standardeingabe an die übergeben Grep Befehl. Ausgabe aus dem Grep Der Befehl wird dann als Eingabe an die übergeben mehr Befehl.

Dadurch werden nur Verzeichnisse in angezeigt /usw:

ls -l /etc | grep '^d' | mehr

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

PS -f | Grep Cron
wer | grep kdm

Beispieldatei

Erstellen Sie zuerst die folgende Beispieldatei, um die Überprüfungsübung auszuprobieren.

Verwenden Sie einen Editor wie Nano oder VIM, um den folgenden Text in eine Datei mit dem Namen zu kopieren Menschen:

Persönlich j.Smith 25000
Persönlich e.Smith 25400
Training a.Brown 27500
Ausbildung c.Browen 23400
(Admin) r.Bron 30500
Goodsout t.Smyth 30000
Persönlich f.Jones 25000
Training* c.Evans 25500
Wareout w.Papst 30400
Erdgeschoss t.Smythe 30500
Persönlich j.Maler 33000

Übung II

  1. Zeigen Sie die Datei an Menschen und untersuchen seinen Inhalt.
  2. Finden Sie alle Zeilen, die die Zeichenfolge enthalten Schmied in der Datei personen.Hinweis: Verwenden Sie den Befehl Grep, aber denken Sie daran, dass es standardmäßig für Fall sensibel ist.
  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. Gehen Sie nun alle Zeilen an, bei denen der Text mit der Zeichenfolge endet 500 in der Datei peoper der 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. Suchen Sie die IP -Adresse des Servers, der in der Datei gespeichert ist /etc/hosts.Hinweis: Verwenden Sie den Befehl Grep mit $ (Hostname)
  8. Verwenden Egrep aus dem extrahieren /etc/passwd Dateikontozeilen enthalten LP oder deine eigene Benutzer-ID.

Übungslösungen finden Sie am Ende dieses Artikels.

Regelmäßigere Ausdrücke

Ein regelmäßiger Ausdruck kann als Platzhalter auf Steroiden angesehen werden.

Es gibt elf Zeichen mit besonderen Bedeutungen: die Eröffnungs- und Schlussquadratklammern [], den Backslash \, das Pfarrer, das Dollar Zeichen $, der Zeitraum oder der Punkt ., das vertikale Balken- oder Rohrsymbol |, das Fragezeichen ?, Das Sternchen oder Stern *, das Pluszeichen + und die Öffnung und Schließung der runden Klammer . Diese Sonderzeichen werden auch oft Metacharacter genannt.

Hier sind die vollständigen Sonderzeichen:

^ Start einer Linie
$ Ende einer Linie
. Jedes Zeichen (außer \ n Newline)
* 0 oder mehr des vorherigen Ausdrucks
| Wechsel, entweder die eine oder andere
[…] Explizite Satz von Charakteren, die übereinstimmen,
+ 1 oder mehr des vorherigen Ausdrucks
? 0 oder 1 des vorherigen Ausdrucks
\ Ein Symbol macht es zu einem wörtlichen Charakter
Explizite Quantifizierernotation
(…) Logische Gruppierung eines Teils eines Ausdrucks

Die Standardversion von Grep hat nur begrenzte regelmäßige Ausdrucksunterstützung. Um alle folgenden Beispiele zu funktionieren, verwenden Sie die Verwendung Egrep stattdessen oder grep -e.

Leitungen mit dem finden | zu einem beiden Ausdruck zu entsprechen:

eGrep 'xxz | xzz' myfile

Zeilen mit | finden So verwenden Sie den Ausdruck in einer Zeichenfolge auch ():):

eGrep '^x (yz | yz)' myfile

Um Zeilen zu finden, die [] mit [] zu einem beliebigen Charakter übereinstimmen:

eGrep '^x [yy] z' myfile

Um Zeilen zu finden, die [] mit [] nicht übereinstimmen, um ein Zeichen zu übereinstimmen:

eGrep '^x [^yy] z' myfile

Um Zeilen zu finden, die mit dem * 0 oder mehr des vorherigen Ausdrucks übereinstimmen, übereinstimmt:

eGrep '^xy*z' myfile

Um Linien zu finden, die das + mit 1 oder mehr des vorherigen Ausdrucks übereinstimmen:

eGrep '^xy+z' myfile

Leitungen mit dem finden ? mit 0 oder 1 des vorherigen Ausdrucks übereinstimmen:

Egrep '^xy?z 'myfile

Übung III

  1. Finden Sie alle Zeilen mit den Namen Evans oder Maler in der Datei personen.
  2. Finden Sie alle Zeilen mit den Namen Smith, Smyth oder Smythe in der Datei personen.
  3. Finden Sie alle Zeilen mit den Namen Brown, Browen oder Bron in der Datei personen.Wenn du Zeit hast:
  4. Finden Sie die Linie mit der Zeichenfolge (Administrator), einschließlich der Klammern in der Datei -Personen.
  5. Finden Sie die Zeile, die das Zeichen * in den Dateimenschen enthält.
  6. Kombinieren Sie 5 und 6 oben, um beide Ausdrücke zu finden.

Mehr Beispiele

Leitungen mit verwenden . und *, um einen Satz von Zeichen zu entsprechen:

Egrep '^xy.*Z 'myfile

Um Zeilen mit zu finden, um die N -Anzahl von Zeichen zu entsprechen:

eGrep '^xy 3 z' myfile
eGrep '^xy 4 z' myfile

Um Zeilen mit zu finden, um n oder mehrmals übereinzustimmen:

eGrep '^xy 3, z' myfile

Um Zeilen mit zu finden, die n -mal, aber nicht mehr als M -Zeiten übereinstimmen:

eGrep '^xy 2,3 z' myfile

Abschluss

In diesem Tutorial haben wir uns zum ersten Mal angesehen Grep In seiner einfachen Form, um Text in einer Datei oder in mehreren Dateien zu finden. Wir haben dann den Text kombiniert, nach dem sie mit einfachen regulären Ausdrücken und dann komplexere gesucht werden sollen Egrep.

Nächste Schritte

Ich hoffe, Sie werden das hier gewonnene Wissen gut genutzt. Ausprobieren Grep Befehle über Ihre eigenen Daten und erinnern sich, dass regelmäßige Ausdrücke, wie hier beschrieben beschrieben vi, sed Und awk!

Übungslösungen

Übung i

Zählen Sie zuerst, wie viele Zeilen in der Datei sind /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, wie viele Zeilen in der Datei den Text enthalten var

grep -c var /etc /passwd

Finden Sie heraus, wie viele Zeilen den Text nicht enthalten var.

grep -cv var /etc /passwd

Finden Sie den Eintrag für Ihr Login in der /etc/passwd Datei

Grep KDM /etc /passwd


Übung II

Zeigen Sie die Datei an Menschen und untersuchen seinen Inhalt.

Katzenmenschen

Finden Sie alle Zeilen, die die Zeichenfolge enthalten Schmied in der Datei Menschen.

Grep 'Smith' Menschen

Erstellen Sie eine neue Datei, Npeopel, enthält alle Zeilen, die mit der Zeichenfolge beginnen persönlich im Menschen Datei

grep '^persönliche' people> npeople

Bestätigen Sie den Inhalt der Datei Npeopel Durch Auflisten der Datei.

Katzen -Npeopel

Gehen Sie nun alle Zeilen an, bei denen der Text mit der Zeichenfolge endet 500 in der Datei Menschen zur Datei Npeopel.

grep '500 $' people >> npeople

Bestätigen Sie erneut den Inhalt der Datei Npeopel Durch Auflisten der Datei.

Katzen -Npeopel

Suchen Sie die IP -Adresse des Servers, der in der Datei gespeichert ist /etc/hosts.

Grep $ (Hostname) /etc /hosts

Verwenden Egrep aus dem extrahieren /etc/passwd Dateikontozeilen enthalten LP oder Ihre eigene Benutzer -ID.

EGREP '(LP | KDM :)' /etc /passwd


Übung III

Finden Sie alle Zeilen mit den Namen Evans oder Maler in der Datei Menschen.

Egrep 'Evans | Maler' Menschen

Finden Sie alle Zeilen mit den Namen Schmied, Smyth oder Smythe in der Datei Menschen.

eGrep 'sm (i | y) die?' Menschen

Finden Sie alle Zeilen mit den Namen Braun, Browen oder Bron in der Datei personen.

Egrep 'Stirn?e?n 'Leute

Finden Sie die Linie mit der Zeichenfolge (Administrator), einschließlich der Klammern in der Datei Menschen.

$ eGrep '\ (admin \)' Menschen

Finden Sie die Linie, die den Charakter enthält * in der Datei personen.

eGrep '\*' Menschen

Kombinieren Sie 5 und 6 oben, um beide Ausdrücke zu finden.

eGrep '\ (admin \) | \*' Menschen