So verwenden Sie reguläre Ausdrücke (Regexes) unter Linux
Fatmawati Achmad Zaenuri/Shutterstock
Sie fragen sich, was diese seltsamen Symbolketten unter Linux bewirken? Sie geben Ihnen Kommandozeilen-Magie! Wir zeigen Ihnen, wie Sie mit regulären Ausdrücken Zaubersprüche anwenden und Ihre Kommandozeilen-Fähigkeiten verbessern.
Was sind reguläre Ausdrücke?
Reguläre Ausdrücke ( Regexes ) sind eine Möglichkeit, passende Zeichenfolgen zu finden. Sie verwenden Buchstaben und Symbole, um ein Muster zu definieren, nach dem in einer Datei oder einem Stream gesucht wird. Es gibt verschiedene Geschmacksrichtungen von Regex. Wir werden uns die Version ansehen, die in gängigen Linux-Dienstprogrammen und -Befehlen verwendet wird, wie |_+_|, der Befehl, der druckt Zeilen, die einem Suchmuster entsprechen . Das ist ein bisschen anders als mit Standard-Regex im Programmierkontext.
Es wurden ganze Bücher über Regexe geschrieben, daher ist dieses Tutorial nur eine Einführung. Es gibt grundlegende und erweiterte Regexes, und wir werden die erweiterten hier verwenden.
Um die erweiterten regulären Ausdrücke mit |_+_| zu verwenden, müssen Sie die |_+_| . verwenden (erweiterte) Option. Da dies sehr schnell ermüdend wird, ist die |_+_| Befehl erstellt wurde. Die |_+_| Befehl ist der gleiche wie der |_+_| Kombination, Sie müssen nur nicht die |_+_| Option jedes Mal.
Anzeige
Wenn Sie es bequemer finden, |_+_| zu verwenden, können Sie dies tun. Beachten Sie jedoch, dass es offiziell veraltet ist. Es ist immer noch in allen Distributionen vorhanden, die wir überprüft haben, aber es könnte in Zukunft verschwinden.
Natürlich können Sie jederzeit Ihre eigenen Aliasnamen erstellen, sodass Ihre bevorzugten Optionen immer für Sie enthalten sind.
VERBUNDEN: So erstellen Sie Aliase und Shell-Funktionen unter Linux
Von kleinen Anfängen
Für unsere Beispiele verwenden wir eine reine Textdatei, die eine Liste von Geeks enthält. Denken Sie daran, dass Sie mit vielen Linux-Befehlen Regexes verwenden können. Wir verwenden nur |_+_| als bequeme Möglichkeit, sie zu demonstrieren.
Hier der Inhalt der Datei:
grep
Der erste Teil der Datei wird angezeigt.
Beginnen wir mit einem einfachen Suchmuster und durchsuchen die Datei nach Vorkommen des Buchstabens o. Auch hier, weil wir die |_+_| . verwenden (erweiterte Regex)-Option in allen unseren Beispielen geben wir Folgendes ein:
grep
Jede Zeile, die das Suchmuster enthält, wird angezeigt und der passende Buchstabe wird hervorgehoben. Wir haben eine einfache Suche ohne Einschränkungen durchgeführt. Dabei spielt es keine Rolle, ob der Buchstabe mehrmals, am Ende der Zeichenfolge, zweimal im selben Wort oder sogar neben sich vorkommt.
Ein paar Namen hatten doppelte O's; Wir geben Folgendes ein, um nur diese aufzulisten:
-E
Anzeige
Unsere Ergebnismenge ist erwartungsgemäß viel kleiner und unser Suchbegriff wird wörtlich interpretiert. Es bedeutet nichts anderes als das, was wir eingegeben haben: Doppel-O-Zeichen.
Im weiteren Verlauf werden wir mit unseren Suchmustern mehr Funktionalität sehen.
VERBUNDEN: Wie verwenden Sie Regex eigentlich?
Zeilennummern und andere grep-Tricks
Wenn du willst |_+_| um die Zeilennummern der passenden Einträge aufzulisten, können Sie die |_+_| (Zeilennummer) Option. Dies ist ein |_+_| Trick – er ist nicht Teil der Regex-Funktionalität. Manchmal möchten Sie jedoch möglicherweise wissen, wo sich in einer Datei die übereinstimmenden Einträge befinden.
Wir geben folgendes ein:
egrep
Ein weiteres praktisches |_+_| Trick, den Sie verwenden können, ist der |_+_| (nur passende) Option. Es zeigt nur die passende Zeichenfolge an, nicht den umgebenden Text. Dies kann nützlich sein, wenn Sie eine Liste schnell nach doppelten Übereinstimmungen in einer der Zeilen durchsuchen müssen.
Dazu geben wir Folgendes ein:
egrep
Wenn Sie die Ausgabe auf das Nötigste reduzieren möchten, können Sie die |_+_| (zählen) Option.
Wir geben Folgendes ein, um die Anzahl der Zeilen in der Datei anzuzeigen, die Übereinstimmungen enthalten:
grep -E
Der Wechseloperator
Wenn Sie sowohl nach Vorkommen von double l als auch double o suchen möchten, können Sie das Pipe-Zeichen (|_+_|) verwenden, das der Alternationsoperator ist. Es sucht nach Übereinstimmungen für das Suchmuster links oder rechts davon.
Wir geben folgendes ein:
-E
Anzeige
Jede Zeile, die ein doppeltes l, o oder beides enthält, wird in den Ergebnissen angezeigt.
Groß-/Kleinschreibung
Sie können auch den Alternation-Operator verwenden, um Suchmuster wie folgt zu erstellen:
egrep
Dies entspricht sowohl am als auch am. Bei allen anderen als trivialen Beispielen führt dies schnell zu umständlichen Suchmustern. Eine einfache Möglichkeit, dies zu umgehen, ist die Verwendung der |_+_| (Groß-/Kleinschreibung ignorieren) Option mit |_+_|.
Dazu geben wir Folgendes ein:
grep
-E
Der erste Befehl erzeugt drei Ergebnisse mit drei hervorgehobenen Übereinstimmungen. Der zweite Befehl führt zu vier Ergebnissen, da das Am in Amanda ebenfalls eine Übereinstimmung ist.
Verankerung
Wir können die Am-Sequenz auch auf andere Weise abgleichen. Beispielsweise können wir gezielt nach diesem Muster suchen oder die Groß-/Kleinschreibung ignorieren und angeben, dass die Sequenz am Anfang einer Zeile stehen muss.
Wenn Sie Sequenzen abgleichen, die an einem bestimmten Teil einer Zeichenzeile oder eines Wortes erscheinen, wird dies als Ankern bezeichnet. Mit dem Caret-Symbol (|_+_|) geben Sie an, dass das Suchmuster eine Zeichenfolge nur dann als Übereinstimmung betrachten soll, wenn sie am Anfang einer Zeile steht.
AnzeigeWir geben Folgendes ein (beachten Sie, dass sich das Caret-Zeichen in den einfachen Anführungszeichen befindet):
grep -E 'Am' geeks.txt
grep
Beide Befehle stimmen mit Am überein.
Suchen wir nun nach Zeilen, die ein doppeltes n am Ende einer Zeile enthalten.
Wir geben Folgendes ein und verwenden ein Dollarzeichen (|_+_|), um das Ende der Zeile darzustellen:
-n
grep
Platzhalter
Sie können einen Punkt ( |_+_| ) verwenden, um ein beliebiges einzelnes Zeichen darzustellen.
Wir geben Folgendes ein, um nach Mustern zu suchen, die mit T beginnen, mit m enden und ein einzelnes Zeichen dazwischen haben:
grep
Das Suchmuster stimmte mit den Sequenzen Tim und Tom überein. Sie können die Punkte auch wiederholen, um eine bestimmte Anzahl von Zeichen anzugeben.
AnzeigeWir geben Folgendes ein, um anzuzeigen, dass es uns egal ist, was die mittleren drei Zeichen sind:
-o
Die Zeile mit Jason wird abgeglichen und angezeigt.
Verwenden Sie das Sternchen (|_+_|), um null oder mehr Vorkommen des vorangehenden Zeichens abzugleichen. In diesem Beispiel ist das Zeichen vor dem Stern der Punkt (|_+_|), was (wieder) ein beliebiges Zeichen bedeutet.
Dies bedeutet, dass das Sternchen (|_+_|) mit einer beliebigen Anzahl (einschließlich Null) von Vorkommen eines beliebigen Zeichens übereinstimmt.
Das Sternchen ist für Regex-Neulinge manchmal verwirrend. Dies liegt vielleicht daran, dass sie es normalerweise als Platzhalter verwenden, der alles bedeutet.
In Regexes hingegen |_+_| stimmt nicht mit cat, cot, coot usw. überein. Stattdessen entspricht es null oder mehr 'c'-Zeichen, gefolgt von einem 't'. Es stimmt also mit t, ct, cct, ccct oder einer beliebigen Anzahl von c-Zeichen überein.
Da wir das Format des Inhalts in unserer Datei kennen, können wir als letztes Zeichen im Suchmuster ein Leerzeichen hinzufügen. Ein Leerzeichen erscheint in unserer Datei nur zwischen dem Vor- und Nachnamen.
AnzeigeWir geben also Folgendes ein, um zu erzwingen, dass die Suche nur die Vornamen aus der Datei enthält:
-c
|
Auf den ersten Blick scheinen die Ergebnisse des ersten Befehls einige ungerade Übereinstimmungen zu enthalten. Sie entsprechen jedoch alle den Regeln des von uns verwendeten Suchmusters.
Die Folge muss mit einem großen J beginnen, gefolgt von einer beliebigen Anzahl von Zeichen und dann einem n. Obwohl alle Übereinstimmungen mit J beginnen und mit einem n enden, sind einige von ihnen nicht das, was Sie vielleicht erwarten.
Da wir das Leerzeichen im zweiten Suchmuster hinzugefügt haben, haben wir das bekommen, was wir wollten: alle Vornamen, die mit J beginnen und auf n enden.
Charakterklassen
Nehmen wir an, wir möchten alle Zeilen finden, die mit einem großen N oder W beginnen.
Wenn wir den folgenden Befehl verwenden, entspricht er jeder Zeile mit einer Sequenz, die entweder mit einem großen N oder W beginnt, unabhängig davon, wo sie in der Zeile erscheint:
-i
Anzeige Das ist nicht das, was wir wollen. Wenn wir den Zeilenanfangsanker (|_+_|) am Anfang des Suchmusters anwenden, wie unten gezeigt, erhalten wir die gleichen Ergebnisse, jedoch aus einem anderen Grund:
grep
Die Suche findet Zeilen, die ein großes W enthalten, an einer beliebigen Stelle in der Zeile. Es stimmt auch mit der Linie 'Nicht mehr' überein, da sie mit einem großen N beginnt. Der Linienanfangsanker (|_+_|) wird nur auf das große N angewendet.
Wir könnten auch einen Zeilenanfangsanker zum Großbuchstaben W hinzufügen, aber das würde bei einem Suchmuster, das komplizierter ist als unser einfaches Beispiel, bald ineffizient werden.
Die Lösung besteht darin, einen Teil unseres Suchmusters in Klammern (|_+_|) einzuschließen und den Ankeroperator auf die Gruppe anzuwenden. Die Klammern (|_+_|) bedeuten ein beliebiges Zeichen aus dieser Liste. Das bedeutet, dass wir den Wechseloperator (|_+_|) weglassen können, da wir ihn nicht brauchen.
Wir können den Zeilenanfangsanker auf alle Elemente in der Liste innerhalb der Klammern (|_+_|) anwenden. (Beachten Sie, dass der Anfang des Linienankers außerhalb der Klammern liegt).
Wir geben Folgendes ein, um nach einer Zeile zu suchen, die mit einem großen N oder W beginnt:
^
Anzeige
Wir werden diese Konzepte auch in den nächsten Befehlen verwenden.
Wir geben Folgendes ein, um nach Personen namens Tom oder Tim zu suchen:
$
Wenn das Caretzeichen (|_+_|) das erste Zeichen in den Klammern (|_+_|) ist, sucht das Suchmuster nach allen Zeichen, die nicht in der Liste erscheinen.
Wir geben beispielsweise Folgendes ein, um nach einem Namen zu suchen, der mit T beginnt, mit m endet und bei dem der Mittelbuchstabe nicht o ist:
.
Wir können eine beliebige Anzahl von Zeichen in die Liste aufnehmen. Wir geben Folgendes ein, um nach Namen zu suchen, die mit T beginnen, mit m enden und einen beliebigen Vokal in der Mitte enthalten:
*
Intervallausdrücke
Sie können Intervallausdrücke verwenden, um anzugeben, wie oft das vorangehende Zeichen oder die Gruppe in der übereinstimmenden Zeichenfolge gefunden werden soll. Sie setzen die Zahl in geschweifte Klammern (|_+_|).
AnzeigeEine Zahl allein bedeutet genau diese Zahl, aber wenn Sie ihr ein Komma (|_+_|) folgen, bedeutet dies diese Zahl oder mehr. Wenn Sie zwei Zahlen mit einem Komma (|_+_|) trennen, bedeutet dies den Zahlenbereich vom kleinsten bis zum größten.
Wir wollen Namen suchen, die mit T beginnen, von mindestens einem, aber nicht mehr als zwei aufeinanderfolgenden Vokalen gefolgt werden und auf m enden.
Also geben wir diesen Befehl ein:
.
Das passt zu Tim, Tom und Team.
Wenn wir nach der Sequenz el suchen möchten, geben wir Folgendes ein:
*
Wir fügen dem Suchmuster ein zweites l hinzu, um nur Sequenzen einzuschließen, die doppelte l enthalten:
'c*t'
Dies entspricht diesem Befehl:
^
Wenn wir einen Bereich von mindestens einem und nicht mehr als zwei Vorkommen von l bereitstellen, wird er mit el- und ell-Sequenzen übereinstimmen.
Dies unterscheidet sich subtil von den Ergebnissen des ersten dieser vier Befehle, bei denen alle Übereinstimmungen für el-Sequenzen waren, einschließlich derer innerhalb der ell-Sequenzen (und nur ein l ist hervorgehoben).
Wir geben folgendes ein:
^
Anzeige
Um alle Sequenzen von zwei oder mehr Vokalen zu finden, geben wir diesen Befehl ein:
[]
Entkommende Charaktere
Nehmen wir an, wir möchten Zeilen finden, in denen ein Punkt (|_+_| das letzte Zeichen ist. Wir wissen, dass das Dollarzeichen (|_+_|) der Zeilenendeanker ist, also könnten wir Folgendes eingeben:
[]
Wie unten gezeigt, bekommen wir jedoch nicht das, was wir erwartet hatten.
Wie bereits erwähnt, entspricht der Punkt (|_+_|) jedem einzelnen Zeichen. Da jede Zeile mit einem Zeichen endet, wurde jede Zeile in den Ergebnissen zurückgegeben.
Wie können Sie also verhindern, dass ein Sonderzeichen seine Regex-Funktion ausführt, wenn Sie nur nach diesem tatsächlichen Zeichen suchen möchten? Dazu verwenden Sie einen Backslash (|_+_|), um das Zeichen zu maskieren.
Einer der Gründe, warum wir |_+_| . verwenden (erweiterte) Optionen liegt daran, dass sie viel weniger Escapes erfordern, wenn Sie die grundlegenden Regexes verwenden.
Wir geben folgendes ein:
|
Anzeige
Dies entspricht dem tatsächlichen Punktzeichen (|_+_|) am Ende einer Zeile.
Verankerung und Worte
Wir haben oben sowohl den Start- (|_+_|) als auch den Zeilenende-Anker (|_+_|) behandelt. Sie können jedoch andere Anker verwenden, um an den Grenzen von Wörtern zu arbeiten.
In diesem Zusammenhang ist ein Wort eine Folge von Zeichen, die durch Leerzeichen (der Anfang oder das Ende einer Zeile) begrenzt wird. psy66oh würde also als Wort gelten, obwohl Sie es nicht in einem Wörterbuch finden werden.
Der Anfang des Wortankers ist (|_+_|); Beachten Sie, dass es nach links zeigt, auf den Anfang des Wortes. Nehmen wir an, ein Name wurde fälschlicherweise in Kleinbuchstaben eingegeben. Wir können das grep |_+_| . verwenden Option, um eine Suche ohne Beachtung der Groß-/Kleinschreibung durchzuführen und Namen zu finden, die mit h beginnen.
Wir geben folgendes ein:
[]
Das findet alle Vorkommen von h, nicht nur die am Anfang von Wörtern.
^
Dies findet nur diejenigen am Anfang von Wörtern.
Machen wir etwas Ähnliches mit dem Buchstaben y; Wir möchten nur Fälle sehen, in denen es am Ende eines Wortes steht. Wir geben folgendes ein:
[]
Dies findet alle Vorkommen von y, wo immer es in den Wörtern vorkommt.
AnzeigeJetzt geben wir Folgendes ein, indem wir den Wortendeanker (|_+_|) verwenden (der nach rechts zeigt, oder das Ende des Wortes):
{}
Der zweite Befehl führt zum gewünschten Ergebnis.
Um ein Suchmuster zu erstellen, das nach einem ganzen Wort sucht, können Sie den Grenzoperator (|_+_|) verwenden. Wir verwenden den Grenzoperator (|_+_|) an beiden Enden des Suchmusters, um eine Zeichenfolge zu finden, die in einem größeren Wort enthalten sein muss:
,
1,2
Weitere Zeichenklassen
Sie können Tastenkombinationen verwenden, um die Listen in Zeichenklassen anzugeben. Diese Bereichsindikatoren ersparen Ihnen, dass Sie jedes Mitglied einer Liste in das Suchmuster eingeben müssen.
Sie können alles Folgende verwenden:
- Vier Gruppen mit vier Ziffern, wobei jede Gruppe durch ein Leerzeichen oder einen Bindestrich (|_+_|) getrennt ist.
- Eine Gruppe von sechzehn Ziffern.
- & rsaquo; So suchen Sie in Google Docs
- & rsaquo; So verwenden Sie den sed-Befehl unter Linux
- › Der Computerordner ist 40: Wie Xerox Star den Desktop erstellte
- › Funktionen vs. Formeln in Microsoft Excel: Was ist der Unterschied?
- › 5 Websites, die jeder Linux-Benutzer mit einem Lesezeichen versehen sollte
- › Was ist MIL-SPEC Fallschutz?
- › So finden Sie Ihr Spotify Wrapped 2021
- & rsaquo; Cyber Monday 2021: Die besten Tech-Deals
Sie können auch beliebig viele Zeichenklassen in einem Suchmuster verwenden. Das folgende Suchmuster entspricht Sequenzen, die mit J beginnen, gefolgt von einem o oder s und dann entweder einem e, h, l oder s:
.)
In unserem nächsten Befehl verwenden wir |_+_| Bereichsspezifizierer.
Unser Suchbefehl gliedert sich wie folgt auf:
Wir fassen alles in folgendem Befehl zusammen:
$
Nichts ist undurchdringlich
Bei einigen Regexes kann es schnell schwierig werden, visuell zu analysieren. Wenn Leute komplizierte Regexe schreiben, fangen sie normalerweise klein an und fügen immer mehr Abschnitte hinzu, bis es funktioniert. Sie neigen dazu, im Laufe der Zeit an Komplexität zuzunehmen.
AnzeigeWenn Sie versuchen, von der endgültigen Version rückwärts zu arbeiten, um zu sehen, was sie tut, ist dies eine ganz andere Herausforderung.
Sehen Sie sich zum Beispiel diesen Befehl an:
.
Wo würden Sie anfangen, das zu entwirren? Wir beginnen am Anfang und nehmen es Stück für Stück:
Unser Suchmuster wird also nach einem der folgenden suchen:
Die Ergebnisse sind unten gezeigt.
Dieses Suchmuster sucht nach gängigen Formen des Schreibens von Kreditkartennummern. Es ist auch vielseitig genug, um mit einem einzigen Befehl verschiedene Stile zu finden.
Geh es langsam an
Komplexität ist normalerweise nur eine Menge Einfachheit, die zusammengeschraubt wird. Sobald Sie die grundlegenden Bausteine verstanden haben, können Sie effiziente, leistungsstarke Dienstprogramme erstellen und wertvolle neue Fähigkeiten entwickeln.
WEITER LESENDave McKay benutzte zum ersten Mal Computer, als Lochstreifen in Mode waren, und programmiert seitdem. Nach über 30 Jahren in der IT-Branche ist er heute hauptberuflich Technologiejournalist. Im Laufe seiner Karriere war er als freiberuflicher Programmierer, Leiter eines internationalen Softwareentwicklungsteams, Projektleiter für IT-Services und zuletzt als Datenschutzbeauftragter tätig. Sein Schreiben wurde von howtogeek.com, cloudavvyit.com, itenterpriser.com und opensource.com veröffentlicht. Dave ist ein Linux-Evangelist und Open-Source-Verfechter.
Vollständige Biografie lesen