GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Reguläre Ausdrücke in Grep (Regex)

grep ist einer der nützlichsten und leistungsstärksten Befehle in Linux für die Textverarbeitung. grep durchsucht eine oder mehrere Eingabedateien nach Zeilen, die mit einem regulären Ausdruck übereinstimmen, und schreibt jede übereinstimmende Zeile in die Standardausgabe.

In diesem Artikel werden wir die Grundlagen der Verwendung regulärer Ausdrücke in der GNU-Version von grep untersuchen , die in den meisten Linux-Betriebssystemen standardmäßig verfügbar ist.

Grep Regulärer Ausdruck #

Ein regulärer Ausdruck oder Regex ist ein Muster, das mit einer Reihe von Zeichenfolgen übereinstimmt. Ein Muster besteht aus Operatoren, konstruiert wörtliche Zeichen und Metazeichen, die eine besondere Bedeutung haben. GNU grep unterstützt drei reguläre Ausdruckssyntaxen, Basic, Extended und Perl-kompatibel.

In seiner einfachsten Form, wenn kein regulärer Ausdruckstyp angegeben ist, grep Suchmuster als grundlegende reguläre Ausdrücke interpretieren. Um das Muster als erweiterten regulären Ausdruck zu interpretieren, verwenden Sie -E ( oder --extended-regexp )-Option.

In der GNU-Implementierung von grep Es gibt keinen funktionalen Unterschied zwischen der grundlegenden und der erweiterten Syntax für reguläre Ausdrücke. Der einzige Unterschied besteht darin, dass in einfachen regulären Ausdrücken die Metazeichen ? sind , + , { , | , ( , und ) werden als wörtliche Zeichen interpretiert. Um die besondere Bedeutung der Metazeichen bei der Verwendung einfacher regulärer Ausdrücke beizubehalten, müssen die Zeichen mit einem umgekehrten Schrägstrich (\ ). Wir werden die Bedeutung dieser und anderer Metazeichen später erklären.

Generell sollten Sie den regulären Ausdruck immer in einfache Anführungszeichen setzen, um die Interpretation und Erweiterung der Metazeichen durch die Shell zu vermeiden.

Wörtliche Übereinstimmungen #

Die einfachste Verwendung von grep Der Befehl besteht darin, nach einem wörtlichen Zeichen oder einer Reihe von Zeichen in einer Datei zu suchen. Zum Beispiel, um alle Zeilen anzuzeigen, die den String „bash“ in /etc/passwd enthalten Datei würden Sie den folgenden Befehl ausführen:

grep bash /etc/passwd

Die Ausgabe sollte in etwa so aussehen:

root:x:0:0:root:/root:/bin/bash
linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

In diesem Beispiel ist die Zeichenfolge „bash“ ein grundlegender regulärer Ausdruck, der aus vier Literalzeichen besteht. Dies teilt grep mit um nach einer Zeichenfolge zu suchen, die ein „b“ unmittelbar gefolgt von „a“, „s“ und „h“ enthält.

Standardmäßig ist das grep Beim Befehl wird zwischen Groß- und Kleinschreibung unterschieden. Das bedeutet, dass Groß- und Kleinbuchstaben als unterschiedlich behandelt werden.

Um die Groß-/Kleinschreibung bei der Suche zu ignorieren, verwenden Sie das -i Option (oder --ignore-case ).

Es ist wichtig zu beachten, dass grep sucht nach dem Suchmuster als Zeichenfolge, nicht als Wort. Wenn Sie also nach „gnu“ gesucht haben, grep druckt auch die Zeilen, in denen „gnu“ in größere Wörter eingebettet ist, wie z. B. „cygnus“ oder „magnum“.

Wenn die Suchzeichenfolge Leerzeichen enthält, müssen Sie sie in einfache oder doppelte Anführungszeichen einschließen:

grep "Gnome Display Manager" /etc/passwd

Ankernummer

Anker sind Metazeichen, mit denen Sie angeben können, wo in der Zeile die Übereinstimmung gefunden werden muss.

Der ^ (Caret)-Symbol stimmt mit der leeren Zeichenfolge am Anfang einer Zeile überein. Im folgenden Beispiel stimmt die Zeichenfolge „linux“ nur dann überein, wenn sie ganz am Anfang einer Zeile steht.

grep '^linux' file.txt

Der $ (Dollar)-Symbol stimmt mit der leeren Zeichenfolge am Anfang einer Zeile überein. Um eine Zeile zu finden, die mit der Zeichenfolge „linux“ endet, würden Sie Folgendes verwenden:

grep 'linux$' file.txt

Sie können auch einen regulären Ausdruck mit beiden Ankern erstellen. Um beispielsweise Zeilen zu finden, die nur „linux“ enthalten, führen Sie Folgendes aus:

grep '^linux$' file.txt

Ein weiteres nützliches Beispiel ist ^$ Muster, das auf alle leeren Zeilen passt.

Übereinstimmendes einzelnes Zeichen #

Der . (Punkt) Symbol ist ein Metazeichen, das jedem einzelnen Zeichen entspricht. Um beispielsweise alles abzugleichen, was mit „kan“ beginnt, dann zwei Zeichen hat und mit der Zeichenfolge „roo“ endet, würden Sie das folgende Muster verwenden:

grep 'kan..roo' file.txt

Klammerausdrücke #

Klammerausdrücke ermöglichen es, eine Gruppe von Zeichen abzugleichen, indem sie in eckige Klammern gesetzt werden [] . Suchen Sie beispielsweise die Zeilen, die „akzeptieren“ oder „Akzent“ enthalten, könnten Sie den folgenden Ausdruck verwenden:

grep 'acce[np]t' file.txt

Wenn das erste Zeichen innerhalb der Klammern das Caretzeichen ^ ist , dann stimmt es mit jedem einzelnen Zeichen überein, das nicht in Klammern eingeschlossen ist. Das folgende Muster stimmt mit jeder Kombination von Zeichenfolgen überein, die mit „co“ beginnen, gefolgt von einem beliebigen Buchstaben außer „l“, gefolgt von „la“, wie „coca“, „cobalt“ usw., aber nicht mit den Zeilen, die „cola“ enthalten “:

grep 'co[^l]a' file.txt

Anstatt Zeichen einzeln zu platzieren, können Sie einen Bereich von Zeichen innerhalb der Klammern angeben. Ein Bereichsausdruck wird erstellt, indem das erste und das letzte Zeichen des Bereichs durch einen Bindestrich getrennt angegeben werden. Beispiel:[a-a] entspricht [abcde] und [1-3][code> entspricht [123][code> .

Der folgende Ausdruck entspricht jeder Zeile, die mit einem Großbuchstaben beginnt:

grep '^[A-Z]' file.txt

grep unterstützen auch vordefinierte Klassen von Zeichen, die in Klammern eingeschlossen sind. Die folgende Tabelle zeigt einige der gebräuchlichsten Zeichenklassen:

Quantifizierer Charakterklassen
[:alnum:] Alphanumerische Zeichen.
[:alpha:] Alphabetische Zeichen.
[:blank:] Leertaste und Tab.
[:ziffer:] Ziffern.
[:lower:] Kleinbuchstaben.
[:upper:] Großbuchstaben.

Eine vollständige Liste aller Zeichenklassen finden Sie im Grep-Handbuch.

Quantifizierer #

Mit Quantifizierern können Sie die Anzahl der Vorkommen von Elementen angeben, die vorhanden sein müssen, damit eine Übereinstimmung auftritt. Die folgende Tabelle zeigt die von GNU grep unterstützten Quantifizierer :

Quantifizierer Beschreibung
* Übereinstimmung mit dem vorherigen Element null oder mehrmals.
? Übereinstimmung mit dem vorherigen Element null oder einmal.
+ Passen Sie das vorherige Element einmal oder mehrmals an.
{n} Übereinstimmung mit dem vorherigen Element genau n mal.
{n,} Übereinstimmung mit dem vorhergehenden Element mindestens n mal.
{,m} Übereinstimmung mit dem vorangehenden Element höchstens m mal.
{n,m} Übereinstimmung mit dem vorhergehenden Element von n zu m mal.

Der * (Sternchen) stimmt mit dem vorangehenden Element null oder mehrmals überein. Folgendes passt zu „right“, „sright“, „ssright“ und so weiter:

grep 's*right'

Unten ist ein fortgeschritteneres Muster, das alle Zeilen abgleicht, die mit einem Großbuchstaben beginnen und entweder mit einem Punkt oder einem Komma enden. Der .* Regex entspricht einer beliebigen Anzahl beliebiger Zeichen:

grep -E '^[A-Z].*[.,]$' file.txt

Der ? (Fragezeichen) macht das vorangehende Element optional und kann nur einmal übereinstimmen. Das Folgende passt sowohl zu „hell“ als auch zu „rechts“. Der ? Zeichen wird mit einem Backslash maskiert, weil wir grundlegende reguläre Ausdrücke verwenden:

grep 'b\?right' file.txt

Hier ist die gleiche Regex mit erweitertem regulären Ausdruck:

grep -E 'b?right' file.txt

Das + (Plus)-Zeichen stimmt mindestens einmal mit dem vorangehenden Element überein. Folgendes passt zu „sright“ und „ssright“, aber nicht zu „right“:

grep -E 's+right' file.txt

Die geschweiften Zeichen {} ermöglicht es Ihnen, die genaue Anzahl, eine Ober- oder Untergrenze oder einen Bereich von Vorkommen anzugeben, die auftreten müssen, damit eine Übereinstimmung zustande kommt.

Folgendes passt zu allen ganzen Zahlen, die zwischen 3 und 9 Ziffern haben:

grep -E '[[:digit:]]{3,9}' file.txt

Alternative Nr.

Der Begriff Alternation ist ein einfaches „ODER“. Der Wechseloperator | (Pipe) ermöglicht es Ihnen, verschiedene mögliche Übereinstimmungen anzugeben, die wörtliche Zeichenfolgen oder Ausdruckssätze sein können. Dieser Operator hat die niedrigste Priorität aller regulären Ausdrucksoperatoren.

Im folgenden Beispiel suchen wir nach allen Vorkommen der Wörter fatal , Fehler und kritisch in der Nginx-Logerror-Datei:

grep 'fatal\|error\|critical' /var/log/nginx/error.log

Wenn Sie den erweiterten regulären Ausdruck verwenden, dann ist der Operator | sollte nicht maskiert werden, wie unten gezeigt:

grep -E 'fatal|error|critical' /var/log/nginx/error.log

Gruppierung #

Gruppieren ist eine Funktion der regulären Ausdrücke, mit der Sie Muster gruppieren und als ein Element referenzieren können. Gruppen werden mit Klammern () erstellt .

Bei der Verwendung von einfachen regulären Ausdrücken muss die Klammer mit einem umgekehrten Schrägstrich (\ ).

Das folgende Beispiel stimmt sowohl mit „fearless“ als auch mit „less“ überein. Der ? Quantifizierer macht den (fear) Gruppe optional:

grep -E '(fear)?less' file.txt

Spezielle Backslash-Ausdrücke #

GNU grep enthält mehrere Metazeichen, die aus einem Backslash gefolgt von einem regulären Zeichen bestehen. Die folgende Tabelle zeigt einige der gebräuchlichsten speziellen Backslash-Ausdrücke:

Ausdruck Beschreibung
\b Wortgrenze abgleichen.
\< Übereinstimmung mit einer leeren Zeichenfolge am Anfang eines Wortes.
\> Übereinstimmung mit einer leeren Zeichenfolge am Ende eines Wortes.
\w Passen Sie ein Wort an.
\s Übereinstimmung mit einem Leerzeichen.

Das folgende Muster entspricht den getrennten Wörtern „abject“ und „object“. Es passt nicht zu den Wörtern, wenn es in größere Wörter eingebettet ist:

grep '\b[ao]bject\b' file.txt

Schlussfolgerung #

Reguläre Ausdrücke werden in Texteditoren, Programmiersprachen und Befehlszeilentools wie grep verwendet , sed , und awk . Zu wissen, wie man reguläre Ausdrücke erstellt, kann sehr hilfreich sein, wenn man Textdateien durchsucht, Skripte schreibt oder die Befehlsausgabe filtert.

Wenn Sie Fragen oder Feedback haben, können Sie gerne einen Kommentar hinterlassen.


Linux
  1. Erste Schritte mit regulären Ausdrücken:Ein Beispiel

  2. Reguläre Ausdrücke einführen

  3. Reguläre Ausdrücke:Alles zusammenziehen

  4. Regex und grep:Datenfluss und Bausteine

  5. Müssen Regex-Zeichen in Sed maskiert werden, um als Regex-Zeichen interpretiert zu werden?

Erste Schritte mit regulären Ausdrücken

Grep Regex:Ein vollständiger Leitfaden

Wie man nach mehreren Zeichenfolgen und Mustern grep

Bash:Reguläre Ausdrücke als Ersatz?

10 praktische Beispiele für Regex mit grep

grep Extraktnummernbereich