16 Bash-Reguläre-Ausdruck (RegEx) Beispiele mit grep, sed und awk-Befehlen
Reguläre Ausdrücke oder Regex sind eine Sequenz von Sonderzeichen, die ein Muster bilden, um spezifische Musterübereinstimmungen aus einer Datei zu finden und zu manipulieren. Sie werden hauptsächlich verwendet, um spezifische Zeichen, Wörter, Filterung oder Textmanipulation in einer Datei zu suchen.
Regex wird hauptsächlich in Programmiersprachen, einschließlich der Linux Bash-Skripterstellung, verwendet. In diesem Leitfaden werde ich erläutern, wie man Regex in Bash verwendet, die wichtigsten regulären Ausdrücke und wie man verschiedene Regex-Verarbeitungs-Engines einsetzt.
- Was ist Regex
- Regex-Versionen
- Syntax von Regex
- Komponenten der Regex-Syntax
- 16 Beispiele für die Verwendung von Regex in Linux
- Regex-Spickzettel
- Fazit
Was ist Regex
Der reguläre Ausdruck oder Regex in Linux ist ein Muster, das aus speziellen Metazeichen besteht, um das spezifische Muster in einem String oder einer Textdatei zu finden.
Lass uns das mit einem Beispiel aus dem wirklichen Leben verstehen. Angenommen, du möchtest einen Code schreiben, um einige spezifische Variablen zu finden und sie dann in einer anderen Code-Datei zu manipulieren. In einem solchen Fall benötigst du möglicherweise reguläre Ausdrücke.
Regex-Versionen
Es gibt verschiedene Versionen von Regex, und es ist wichtig zu beachten, dass nicht alle Kommandos von Regex-Prozessoren alle Regex unterstützen.
- Basis regulärer Ausdruck (BRE)
- Erweiterter regulärer Ausdruck (ERE)
- Perl-kompatible reguläre Ausdrücke (PCRE)
Die BRE und ERE werden weiter klassifiziert als:
- POSIX BRE/ERE
- GNU BRE/ERE
POSIX BRE und POSIX ERE sind Teilmengen von GNU BRE und ERE, und GNU BRE/ERE ist eine Teilmenge von PCRE.
Syntax von Regex
Verschiedene Befehlszeilenwerkzeuge werden mit regulären Ausdrücken verwendet, wie zum Beispiel:
- grep
- aber
- awk
Diese Befehle werden auch als Regex-Engines bezeichnet, die dabei helfen, komplexe reguläre Ausdrücke zu übersetzen und das Ergebnis zu liefern.
Regex-Syntax mit grep
grep [options] 'pattern' [string/filename]Regex-Syntax mit sed
sed [options] '/pattern/' [string/filename]Regex-Syntax mit awk
awk [options] '/pattern/' [string/filename]Komponenten der Regex-Syntax
Es gibt sechs Hauptkomponenten der Syntax regulärer Ausdrücke:
- Charaktere
- Metazeichen
- Quantifizierer
- Charakterklassen
- Gruppierung
- Umgebungsbeobachtungen
Zeichen: Diese Komponenten bilden Muster, indem sie beliebige einzelne Zeichen oder mehrere Zeichen verwenden, um nach genauen Mustern in der Zeichenkette oder Datei zu suchen. Zum Beispiel wird das Zeichen H nach H in der Datei suchen, ebenso wird das Wort Linux nach dem genauen Wort Linux in der Datei suchen. Das -i Flag kann jedoch verwendet werden, um die Suche nicht groß-/kleinschreibungsabhängig zu machen.
Metazeichen: Diese Komponenten enthalten spezielle Zeichen und haben eine bestimmte Funktionalität. Zum Beispiel wird das Punkt-Metazeichen verwendet, um das Zeichen zu finden, während ^den Anfang der Zeile und $ das Ende der Zeile markiert. Ein weiteres Metazeichen, die Pipe a|b, wird verwendet, um a und b in der Datei zu finden.
Quantoren: Diese Komponenten werden verwendet, um herauszufinden, wie oft ein bestimmtes Muster wiederholt werden muss. Zum Beispiel wiederholt das Fragezeichen ? das vorhergehende Zeichen nur null oder einmal, während der Stern das vorhergehende Zeichen null oder mehrmals findet.
Zeichengruppen: Die in den eckigen Klammern ([]) eingeschlossenen Gruppen von Zeichen werden als Komponenten der Zeichennorm bezeichnet. Zum Beispiel zeigt [0-9] die Zahlen von 0 bis 9 an, während [A-Z] alle Buchstaben von A bis Z in Großbuchstaben angibt.
Gruppierung: Diese Komponente hilft dabei, das Muster in runden Klammern() zu gruppieren. Sie ist besonders nützlich, um sich wiederholende Sequenzen wie Telefonnummern oder E-Mail-Adressen zu finden.
Lookarounds: Diese Komponente wird verwendet, um eine positive und negative Suche um ein Muster, das von einem anderen Muster vorausgegangen oder gefolgt wird, durchzuführen. Zum Beispiel wird a(?=b) alle a‘s finden, wenn sie vor b stehen.
16 Beispiele für die Verwendung von Regex in Linux
Die folgenden Beispiele decken die Verwendung verschiedener Metazeichen, Quantifizierer, Gruppen und einiger einzigartiger Muster ab.
Beispiel 1: Verwendung des Punkt (.) Ausdrucks
Der Punkt ist das grundlegende Metazeichen von regulären Ausdrücken, das verwendet wird, um ein einzelnes Zeichen zu matchen. Zum Beispiel:
Mit grep:
grep 'U.untu' mytextfile.txt
Mit sed:
sed -n '/U.untu/p' mytextfile.txtVerwendung von awk:
awk '/U.untu/' mytextfile.txtBeispiel 2: Verwendung des Caret (^) Ausdrucks
Das Caret ^ Metazeichen wird verwendet, um alle Zeilen zu finden, die mit dem gegebenen Muster beginnen. Zum Beispiel:
grep verwenden:
grep '^K' mytextfile.txtVerwendung von sed:
sed -n '/^K/p' mytextfile.txtVerwendung von awk:
awk '/^K/' mytextfile.txtDie obigen Befehle geben alle Einträge in der Datei aus, beginnend mit K.
Beispiel 3: Verwendung des Dollar ($) Ausdrucks
Dieses Metazeichen wird verwendet, um alle Zeichenfolgen zu finden, die mit einem bestimmten Zeichen enden. Zum Beispiel:
grep verwenden:
grep 'u$' mytextfile.txtVerwendung von sed:
sed -n '/u$/p' mytextfile.txtVerwendung von awk:
awk '/u$/' mytextfile.txtDie obigen Befehle geben alle Strings in der Datei zurück, die mit u enden.
Beispiel 4: Verwendung des Asterisk (*) Ausdrucks
Der Asterisk * Quantifizierer entspricht dem Auftreten der vorhergehenden Zeichen im String null oder mehrmals. Er ist äquivalent zu {0,}. Zum Beispiel:
grep verwenden:
grep 'tu*' mytextfile.txtVerwendung von sed:
sed -n '/tu*/p' mytextfile.txtVerwendung von awk:
awk '/tu*/' mytextfile.txtBeispiel 5: Verwendung des Fragezeichen (?) Ausdrucks
Das Fragezeichen (?) Quantifier wird verwendet, um zu suchen, ob das vorhergehende Zeichen null oder nur einmal vorkommt. Es fungiert als optionaler Qualifizierer.
grep verwenden:
grep -E 'Ub?' mytextfile.txtDas -E im obigen Befehl steht für erweiterte Regex.
Verwendung von sed:
sed -nE '/Ub?/p' mytextfile.txtDas -E im obigen Befehl steht für erweiterte Regex.
Verwendung von awk:
awk '/Ub/' mytextfile.txtDer Unterschied zwischen dem Sternchen- und dem Fragezeichen-Quantifizierer wird im Bild unten erwähnt:
Das Sternchen sucht nach allen Zeichen, die mit dem vorhergehenden Zeichen übereinstimmen, während das Fragezeichen des vorhergehenden Zeichens nur einmal übereinstimmt.
Beispiel 6: Verwendung des Backslash (\) Ausdrucks
Dieses Backslash \ Metazeichen wird verwendet, um das Sonderzeichen darzustellen. Zum Beispiel ist der Stern * selbst ein Sonderzeichen. Um den Stern buchstäblich zu verwenden, verwenden wir das Backslash.
Lass uns alle Linux-Distributionen in der Datei mytextfile.txt finden, die Leerzeichen in ihren Namen haben.
Verwendung von grep:
grep '\s' mytextfile.txtVerwendung von sed:
sed -n '/\s/p' mytextfile.txtVerwendung von awk:
awk '/\s/' mytextfile.txtDarüber hinaus wird der Backslash auch mit anderen verschiedenen Escape-Zeichen verwendet.
Beispiel 7: Erstellen einer Gruppe von Mustern mit runden Klammern()
Die runden Klammern() werden verwendet, um die Gruppe von Ausdrücken innerhalb von ihnen zuzuordnen. Lassen Sie uns dies anhand eines Beispiels verstehen:
grep verwenden:
grep -E '(untu)' mytextfile.txtVerwendung von sed:
sed -nE '/(untu)/p' mytextfile.txtVerwendung von awk:
awk '/(untu)/' mytextfile.txtIn den oben genannten Befehlen erfasst der Motor Einträge, die mit der Gruppe (untu) übereinstimmen. Die Gruppe kann auch mit einem anderen Muster verwendet werden, das ihr folgt. Wenn wir zum Beispiel die Gruppe (untu) durch (unt)u ersetzen, wird das Ergebnis dasselbe sein.
Beispiel 8: Erstellen von bereichsgebundenen Mustern mit geschweiften Klammern {} Ausdruck
Die geschweiften Klammern {} sind Wiederholungsquantifizierer. Sie können sie auf 3 verschiedene Arten verwenden:
{x}: Erscheint x Mal
{x,y} oder {min,max}: Erscheint x-mal, aber nicht mehr als y
{x,}: Mehrmals und mehr erscheine x Mal
grep verwenden:
grep -E l\{2} mytextfile.txtVerwendung von sed:
sed -nE '/l{2}/p' mytextfile.txtVerwendung von awk:
awk '/l{2}/' mytextfile.txtDer obige Befehl findet Einträge, die das Zeichen l zweimal enthalten, wie Bill und Skill.
Beispiel 9: Verwendung von \d zur Auffindung von Ziffern
Der \d Ausdruck wird verwendet, um die Zeichenfolge mit Ziffern in einer Zeichenfolge oder Datei zu finden. Zum Beispiel:
grep verwenden:
grep -P '\d' mytextfile.txtP zeigt an, dass es sich um einen Perl-kompatiblen regulären Ausdruck handelt. Weitere Details finden Sie hier.
In sed und awk kann \d nicht verwendet werden, da sed POSIX-Reguläre Ausdrücke und nicht Perl PCRE ist. Daher entspricht \d in sed und awk [0-9] oder [[:digit:]].
Verwendung von sed:
sed -n '/[0-9]/p' mytextfile.txtOder :
sed -n '/[[:digit:]]/' mytextfile.txtVerwendung von awk:
awk '/[0-9]/' mytextfile.txtOder :
awk -n '/[[:digit:]]/' mytextfile.txtBeispiel 10: Verwendung des logischen ODER-Operators |
Der reguläre Ausdruck funktioniert auf die gleiche Weise wie das logische ODER-Gatter. Wenn wir beispielsweise a|o verwenden, wird dieses Muster alle Wörter finden, die entweder ein a- oder ein o-Zeichen enthalten.
Verwendung von grep:
grep -E 'k|a' mytextfile.txtVerwendung von sed:
sed -nE '/k|a/p' mytextfile.txtVerwendung von awk:
awk '/k|a/' mytextfile.txtBeispiel 11: Alle Wörter mit einer bestimmten Anzahl von Zeichen finden
Um alle Wörter mit einer bestimmten Anzahl von Zeichen zu finden, können wir einen Punkt (.) verwenden. Der Punkt-Metazeichen wird verwendet, um ein Zeichen zu finden, kann aber auch verwendet werden, um mehrere Zeichen zu suchen. Um alle Zeilen mit vier Zeichen zu finden, verwenden Sie:
Verwendung von grep:
grep '^....$' mytextfile.txtVerwendung von sed:
sed -n '/^....$/p' mytextfile.txtVerwendung von awk:
awk '/^....$/' mytextfile.txtBeispiel 12: Finden der IP-Adresse aus einer Datei
Die IP-Adresse ist eines der wichtigsten Elemente, die Sie mit Regex aus einer Datei extrahieren möchten. Da eine IP-Adresse Punkte enthält, ist es nicht einfach, sie mit Regex zu finden: Wir müssen den Punkt (.) mit einem Schrägstrich escapem. Lassen Sie uns IP-Adressen aus der /etc/hosts-Datei extrahieren.
grep verwenden:
grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /etc/hostsOder :
grep -E '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' /etc/hostsVerwendung von sed:
sed -nE '/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/p' /etc/hostsVerwendung von awk:
awk '/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/' /etc/hostsBeispiel 13: Finden der Dezimalzahlen
Eine Dezimalzahl ist eine kombinierte Zahl aus einer ganzen Zahl und einem Bruchteil, der nach dem Punkt (.) kommt. Um die Dezimalzahl aus einer Datei mit Regex zu erhalten, siehe den unten angegebenen Befehl:
grep verwenden:
grep -P '^\d*\.\d+$' mytextfile.txtDas \d ist gleichwertig mit [[:digit:]] und [0-9], aber grep unterstützt PCRE-Regex, sodass wir es mit dem -P-Flag verwenden können.
Verwendung von sed:
sed -nE '/[[:digit:]]*\.[[:digit:]]+$/p' mytextfile.txtVerwendung von awk:
awk '/[0-9]*\.[0-9]+$/' mytextfile.txtSie können [[:digit:]] in den obigen Befehlen durch [0-9] ersetzen.
Beispiel 14: Die Uhrzeit im 12-Stunden-Format HH:MM finden
Regex kann auch verwendet werden, um Zeit in einer Datei zu finden, lassen Sie uns anschauen, wie man Zeit aus einer Datei mit grep, sed und awk-Befehlen extrahiert:
Verwendung von grep:
grep -E '^(0?[1-9]|1[0-2]):[0-5][0-9]$' mytextfile.txtVerwendung von sed:
sed -nE '/^(0?[1-9]|1[0-2]):[0-5][0-9]$/p' mytextfile.txtVerwendung von awk:
awk '/^(0?[1-9]|1[0-2]):[0-5][0-9]$/' mytextfile.txtBeispiel 15: Das Datum im Format JJJJ-MM-TT finden
Um die Zeit aus einer Datei zu extrahieren, verwenden wir den folgenden Regex mit grep:
grep verwenden:
grep -P '([12]\d{3}:(0[1-9]|1[0-2]):(0[1-9]|[12]\d|3[01]))' mytextfile.txtVerwendung von sed:
sed -nE '/([12][[:digit:]]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][[:digit:]]|3[01]))/p' mytextfile.txtVerwendung von awk:
awk '/([12][[:digit:]]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][[:digit:]]|3[01]))/' mytextfile.txtBeispiel 16: Finden und Ersetzen von Mustern
Die Substitution ist eine weitere Regex-Methode, die verwendet wird, um das Muster zu finden und zu ersetzen. Zum Beispiel:
Verwendung von sed:
Syntax:
sed -i 's/[pattern]/[replacement]/' [filename]Die ursprüngliche Textdatei lautet:
Führen Sie den Befehl aus:
sed -i 's/KaOS/Peepin/' mytextfile.txtIn dem obigen Befehl wird -i verwendet, um die Originaldatei zu ändern. Ohne dieses Flag wird die Datei nur das Ergebnis im Terminal ausgeben, anstatt die Datei zu ändern.
Überprüfen Sie die Datei zur Verifizierung:
Die Suche kann weiter verbessert werden, indem man g am Ende des Ausdrucks verwendet; das g ersetzt alle Vorkommen. Ohne es wird nur das erste Vorkommen ersetzt.
Verwendung von awk:
Syntax:
awk '{sub([pattern]/[replacement]); print}' [filename] > [new_filename]Führen Sie den Befehl aus:
awk '{sub(Peepin/,"KaOS"); print}' mytextfile.txt > newtextfile.txtUm zu überprüfen, überprüfen Sie die neue Datei:
Peepin ist jetzt wieder zu KaOS in die neue Datei zurückgekehrt.
Es kann auch verbessert werden, indem gsub anstelle von sub verwendet wird, um alle Vorkommen des Musters zu ersetzen.
Eine weitere wichtige Sache, die zu berücksichtigen ist: Der awk-Befehl zeigt die Ausgabe nur im Terminal an, ohne die Originaldatei zu ändern. Um das Ergebnis zu speichern, verwenden Sie den Umleitungsoperator und geben Sie den Dateinamen an.
Regex-Spickzettel
Regular Expressions bieten viele Metazeichen und Quantifizierer, um komplexe Muster zu erstellen, die die Suche noch verbessern. Lassen Sie uns die häufig verwendeten Regex-Regeln auflisten.
Regex-Zeichenklassen
Quantoren und Alternation
Anker
Escape-Zeichen
Gruppen und Lookarounds
Fazit
Der Regex ist eine Zeichenfolge, die verwendet wird, um ein Muster zu erstellen, das bei der Suche nach Informationen in einer Datei und deren Verarbeitung hilft. Es gibt verschiedene Regex-Engines in Linux, wie grep, sed und awk. Dieser Leitfaden behandelt grundlegende bis fortgeschrittene reguläre Ausdrücke unter Verwendung aller drei Linux-Befehle. Es ist wichtig zu beachten, dass nicht alle Linux-Regex-Engines alle Varianten von Regex unterstützen, zum Beispiel unterstützen sed und awk kein PCRE, während alle Engines BRE, ERE und PCRE unterstützen.



























































