In unserem vorherigen Artikel zu regulären Ausdrücken, Teil 1, haben wir grundlegende Reg-Ex mit praktischen Beispielen überprüft.
Aber wir können mit den regulären Ausdrücken noch viel mehr machen. Sie können komplexe Aufgaben oft mit einem einzigen regulären Ausdruck erledigen, anstatt mehrere Codezeilen zu schreiben.
Wenn Sie eine Regex auf einen String anwenden, beginnt die Regex-Engine beim ersten Zeichen des Strings. Es werden alle möglichen Permutationen des regulären Ausdrucks beim ersten Zeichen ausprobiert. Erst wenn alle Möglichkeiten ausprobiert und für fehlgeschlagen befunden wurden, fährt die Regex-Engine mit dem zweiten Zeichen im Text fort.
Die Regex probiert alle möglichen Permutationen der Regex in genau derselben Reihenfolge aus. Das Ergebnis ist, dass die auf Regex ausgerichtete Engine die am weitesten links liegende Übereinstimmung zurückgibt.
Lassen Sie uns in diesem Artikel einige fortgeschrittene reguläre Ausdrücke mit Beispielen überprüfen.
Beispiel 1. ODER-Operation (|)
Das Pipe-Zeichen (|) in grep wird verwendet, um anzugeben, dass einer von zwei ganzen Unterausdrücken an einer Position auftritt. „subexpression1|subexpression2“ entspricht entweder subexpression1 oder subexpression2.
Das folgende Beispiel entfernt drei verschiedene Arten von Kommentarzeilen in einer Datei mit OR in einem grep-Befehl.
Erstellen Sie zunächst eine Beispieldatei mit dem Namen „comments“.
$ cat comments This file shows the comment character in various programming/scripting languages ### Perl / shell scripting If the Line starts with single hash symbol, then its a comment in Perl and shell scripting. ' VB Scripting comment The line should start with a single quote to comment in VB scripting. // C programming single line comment. Double slashes in the beginning of the line for single line comment in C.
Die Datei namens „comments“ enthält Kommentarzeilen für Perl, VB-Skript und C-Programmierung. Nun sucht der folgende grep-Befehl nach der Zeile, die nicht mit # oder einfachen Anführungszeichen (‘) oder doppelten vorderen Schrägstrichen (//) beginnt.
$ grep -v "^#\|^'\|^\/\/" comments This file shows the comment character in various programming/scripting languages If the Line starts with single hash symbol, then its a comment in Perl and shell scripting. The line should start with a single quote to comment in VB scripting. Double slashes in the beginning of the line for single line comment in C.
Beispiel 2. Zeichenklassenausdruck
Wie wir in unserem vorherigen Regex-Artikel Beispiel 9 gesehen haben, kann eine Liste von Zeichen mit in eckigen Klammern erwähnt werden, um nur einem von mehreren Zeichen zu entsprechen. Der Grep-Befehl unterstützt einige Sonderzeichenklassen, die bestimmte allgemeine Bereiche bezeichnen. Einige davon sind hier aufgeführt. Schlagen Sie in der Manpage von grep nach, um verschiedene Zeichenklassenausdrücke zu kennen.
[:digit:] Only the digits 0 to 9 [:alnum:] Any alphanumeric character 0 to 9 OR A to Z or a to z. [:alpha:] Any alpha character A to Z or a to z. [:blank:] Space and TAB characters only.
Diese werden immer in eckigen Klammern in der Form [[:Ziffer:]] verwendet. Lassen Sie uns nun alle Prozess-IDs des ntpd-Daemon-Prozesses mit dem entsprechenden Zeichenklassenausdruck auslesen.
$ grep -e "ntpd\[[[:digit:]]\+\]" /var/log/messages.4 Oct 28 11:42:20 gstuff1 ntpd[2241]: synchronized to LOCAL(0), stratum 10 Oct 28 11:42:20 gstuff1 ntpd[2241]: synchronized to 15.11.13.123, stratum 3 Oct 28 12:33:31 gstuff1 ntpd[2241]: synchronized to LOCAL(0), stratum 10 Oct 28 12:50:46 gstuff1 ntpd[2241]: synchronized to 15.11.13.123, stratum 3 Oct 29 07:55:29 gstuff1 ntpd[2241]: time reset -0.180737 s
Beispiel 3. M bis N Vorkommen ({m,n})
Ein regulärer Ausdruck gefolgt von {m,n} gibt an, dass das vorhergehende Element mindestens m-mal, aber nicht mehr als n-mal gefunden wird. Die Werte von m und n müssen nicht negativ und kleiner als 255 sein.
Das folgende Beispiel gibt die Zeile aus, wenn sie im Bereich von 0 bis 99999 liegt.
$ cat number 12 12345 123456 19816282 $ grep "^[0-9]\{1,5\}$" number 12 12345
Die Datei namens „number“ enthält die Liste der Zahlen, der obige grep-Befehl passt nur auf die Zahl, die 1 (Minimum ist 0) bis 5 Ziffern (Maximum 99999) umfasst.
Hinweis :Für grundlegende Beispiele für grep-Befehle lesen Sie 15 Praktische Beispiele für grep-Befehle.
Beispiel 4. Exaktes M Vorkommen ({m})
Ein regulärer Ausdruck gefolgt von {m} stimmt mit genau m Vorkommen des vorangehenden Ausdrucks überein. Der folgende grep-Befehl zeigt nur die 5-stellige Nummer an.
$ grep "^[0-9]\{5\}$" number 12345
Beispiel 5. M oder mehr Vorkommen ({m,})
Ein regulärer Ausdruck gefolgt von {m,} stimmt mit m oder mehr Vorkommen des vorhergehenden Ausdrucks überein. Der folgende grep-Befehl zeigt die Nummer mit 5 oder mehr Ziffern an.
$ grep "[0-9]\{5,\}" number 12345 123456 19816282
Hinweis Hinweis:Wussten Sie, dass Sie mit dem Befehl bzgrep in bzip2-komprimierten Dateien nach einer Zeichenfolge oder einem Muster (regulärer Ausdruck) suchen können?
Beispiel 6. Wortgrenze (\b)
\b soll für eine Wortgrenze passen. \b findet alle Zeichen am Anfang (\bxx) und/oder Ende (xx\b) eines Wortes, also findet \bthe\b die, aber nicht die, aber \bthe findet sie.
# grep -i "\bthe\b" comments This file shows the comment character in various programming/scripting languages If the Line starts with single hash symbol, The line should start with a single quote to comment in VB scripting. Double slashes in the beginning of the line for single line comment in C.
Beispiel 7. Rückverweise (\n)
Das Gruppieren der Ausdrücke zur weiteren Verwendung ist in grep durch Rückverweise verfügbar. Zum Beispiel entspricht \([0-9]\)\1 einer zweistelligen Zahl, bei der beide Ziffern dieselbe Zahl sind, wie 11,22,33 usw.,
# grep -e '^\(abc\)\1$' abc abcabc abcabc
Im obigen grep-Befehl akzeptiert es die Eingabe der STDIN. Wenn es die Eingabe „abc“ liest, stimmt es nicht überein. Die Zeile „abcabc“ stimmt mit dem angegebenen Ausdruck überein, sodass es gedruckt wird. Wenn Sie einen erweiterten regulären Ausdruck verwenden möchten, ist es immer vorzuziehen, den Befehl egrep zu verwenden. grep mit der Option -e funktioniert auch wie egrep, aber Sie müssen die Sonderzeichen wie Klammern maskieren.
Hinweis :Sie können auch den Befehl zgrep verwenden, um in einer komprimierten gz-Datei zu suchen.
Beispiel 8. Übereinstimmung mit dem Muster „Objektorientiert“
Bisher haben wir verschiedene Tipps im grep-Befehl gesehen. Lassen Sie uns nun anhand dieser Tipps „objektorientiert“ in verschiedenen Formaten abgleichen.
$ grep "OO\|\([oO]bject\( \|\-\)[oO]riented\)"
Der obige grep-Befehl passt auf „OO“, „objektorientiert“, „objektorientiert“ usw.,
Beispiel 9. Drucken Sie die Zeile „vowel singlecharacter samevowel“
Der folgende grep-Befehl gibt alle Zeilen aus, die einen Vokal (a, e, i, o oder u) enthalten, gefolgt von einem einzelnen Zeichen, gefolgt von demselben Vokal. Daher findet es Eva oder Adam, aber nicht Vera.
$ cat input evening adam vera $ grep "\([aeiou]\).\1" input evening adam
Beispiel 10. Gültige IP-Adresse
Der folgende grep-Befehl vergleicht nur gültige IP-Adressen.
$ cat input 15.12.141.121 255.255.255 255.255.255.255 256.125.124.124 $ egrep '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' input 15.12.141.121 255.255.255.255
In dem oben angegebenen regulären Ausdruck gibt es verschiedene Bedingungen. Diese bedingten Übereinstimmungen sollten dreimal vorkommen und eine weitere Klasse wird separat erwähnt.
- Wenn es mit 25 beginnt, sollte die nächste Zahl 0 bis 5 (250 bis 255) sein
- Wenn es mit 2 beginnt, könnte die nächste Zahl 0-4 sein, gefolgt von 0-9 (200 bis 249)
- kein Vorkommen von 0 oder 1, 0-9, dann kein Vorkommen einer Zahl zwischen 0-9 (0 bis 199)
- Dann Punktzeichen
Den ersten Teil dieses Artikels finden Sie unter Reguläre Ausdrücke im Grep-Befehl mit 10 Beispielen – Teil I