So verwenden Sie reguläre Ausdrücke (Regexes) unter Linux

Ein Laptop mit einem Linux-Terminal mit grünen Textzeilen.

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.

Anzeige

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

Anzeige

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

Anzeige

Wir 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:

-iAnzeige

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 (|_+_|).

Anzeige

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

Anzeige

Jetzt 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:

    A-Z:Alle Großbuchstaben von A bis Z. a-z:Alle Kleinbuchstaben von a bis z. 0-9:Alle Ziffern von null bis neun. d-p:Alle Kleinbuchstaben von d bis p. Mit diesen Formatvorlagen im freien Format können Sie Ihren eigenen Bereich definieren. 2-7:Alle Zahlen von zwei bis sieben.

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:

    H:Die Sequenz muss mit H beginnen. [a-z]:Das nächste Zeichen kann ein beliebiger Kleinbuchstabe in diesem Bereich sein. *:Der Stern steht hier für eine beliebige Anzahl von Kleinbuchstaben. Mann:Die Sequenz muss mit Mann enden.

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.

Anzeige

Wenn 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:

    ^:Der Linienanfangsanker. Also muss unsere Sequenz das Erste in einer Zeile sein. ([0-9] {4} [-]):Die Klammern fassen die Suchmusterelemente zu einer Gruppe zusammen. Andere Operationen können auf diese Gruppe als Ganzes angewendet werden (dazu später mehr). Das erste Element ist eine Zeichenklasse, die einen Ziffernbereich von null bis neun enthält |_+_|. Unser erstes Zeichen ist also eine Ziffer von null bis neun. Als nächstes haben wir einen Intervallausdruck, der die Zahl vier |_+_| enthält. Dies gilt für unser erstes Zeichen, von dem wir wissen, dass es eine Ziffer sein wird. Daher ist der erste Teil des Suchmusters jetzt vierstellig. Es kann entweder ein Leerzeichen oder ein Bindestrich (|_+_|) einer anderen Zeichenklasse folgen. {3}:Ein Intervallbezeichner mit der Zahl drei folgt unmittelbar auf die Gruppe. Es wird auf die gesamte Gruppe angewendet, daher besteht unser Suchmuster jetzt aus vier Ziffern, gefolgt von einem Leerzeichen oder einem Bindestrich, der dreimal wiederholt wird. [0-9]:Als nächstes haben wir eine weitere Zeichenklasse, die einen Ziffernbereich von null bis neun enthält |_+_|. Dadurch wird dem Suchmuster ein weiteres Zeichen hinzugefügt, das eine beliebige Ziffer von null bis neun sein kann. {4}:Ein anderer Intervallausdruck, der die Zahl Vier enthält, wird auf das vorherige Zeichen angewendet. Dies bedeutet, dass aus einem Zeichen vier Zeichen werden, die alle eine beliebige Zahl von null bis neun sein können. |:Der Alternation-Operator sagt uns, dass alles links davon ein vollständiges Suchmuster ist und alles rechts davon ein neues Suchmuster. Dieser Befehl sucht also tatsächlich nach einem von zwei Suchmustern. Die erste besteht aus drei Gruppen von vier Ziffern, gefolgt von einem Leerzeichen oder einem Bindestrich, und dann werden weitere vier Ziffern angeheftet. [0-9]:Das zweite Suchmuster beginnt mit einer beliebigen Ziffer von null bis neun. {16}:Ein Intervalloperator wird auf das erste Zeichen angewendet und in 16 Zeichen umgewandelt, die alle Ziffern sind.

Unser Suchmuster wird also nach einem der folgenden suchen:

  • Vier Gruppen mit vier Ziffern, wobei jede Gruppe durch ein Leerzeichen oder einen Bindestrich (|_+_|) getrennt ist.
  • Eine Gruppe von sechzehn Ziffern.

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 LESEN Profilfoto von Dave McKay Dave McKay
Dave 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

Interessante Artikel