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.