Wenn Sie schon eine Weile mit Linux arbeiten, kennen Sie bereits grep — Global Regular Expression Print, ein Textverarbeitungsprogramm, mit dem Sie Dateien und Verzeichnisse durchsuchen können. In den Händen eines Linux-Power-Users ist es sehr nützlich. Wenn Sie es jedoch ohne Regex verwenden, können seine Möglichkeiten eingeschränkt sein.
Aber was ist Regex?
Regex sind reguläre Ausdrücke, die Sie verwenden können, um die Suchfunktion von grep zu verbessern. Regex ist per Definition ein fortschrittliches Muster zum Filtern der Ausgabe. Mit etwas Übung können Sie Regex effektiv einsetzen, denn Sie können es auch mit anderen Linux-Befehlen verwenden.
In unserem Tutorial lernen Sie, wie Sie Grep und Regex effektiv nutzen können.
Vorraussetzung
Die Verwendung von grep mit regex erfordert gute Linux-Kenntnisse. Wenn Sie Anfänger sind, schauen Sie sich unsere Linux-Anleitungen an.
Außerdem benötigen Sie Zugang zu einem Laptop oder Computer mit einem Linux-Betriebssystem. Sie können jede Linux-Distribution Ihrer Wahl verwenden. Und wenn Sie einen Windows-Rechner haben, können Sie trotzdem Linux mit WSL2 verwenden. Lesen Sie unsere ausführliche Stellungnahme dazu hier.
Der Zugang zur Kommandozeile/zum Terminal ermöglicht es Ihnen, alle Befehle auszuführen, die in unserem grep/regex-Tutorial beschrieben sind.
Darüber hinaus benötigen Sie auch Zugang zu einer Textdatei, die Sie für die Ausführung der Beispiele benötigen. Ich habe ChatGPT verwendet, um eine Wand aus Text zu erzeugen und ihm zu sagen, dass er über Technik schreiben soll. Die Aufforderung, die ich verwendet habe, lautet wie folgt.
“Generieren Sie 400 Wörter über Technik. Er sollte die meisten technischen Themen enthalten. Achten Sie außerdem darauf, dass Sie die Namen der Technologien im Text wiederholen.”
Sobald der Text erstellt war, habe ich ihn kopiert und in der Datei tech.txt gespeichert, die wir im Laufe des Tutorials verwenden werden.
Und schließlich ist ein grundlegendes Verständnis des grep-Befehls ein Muss. Sie können sich 16 Beispiele für den Befehl grep ansehen, um Ihr Wissen aufzufrischen. Außerdem stellen wir Ihnen den Befehl grep kurz vor, um Ihnen den Einstieg zu erleichtern.
Syntax und Beispiele für den Befehl grep
Die Syntax des Befehls grep ist einfach.
$ grep -options [regex/pattern] [files]
Wie Sie sehen können, erwartet der Befehl ein Muster und die Liste der Dateien, die Sie ausführen möchten.
Es gibt eine Vielzahl von grep-Optionen, die die Funktionalität des Befehls verändern. Dazu gehören:
- – i: Fälle ignorieren
- –r: eine rekursive Suche durchführen
- –w : eine Suche durchführen, die nur ganze Wörter findet
- –v: alle nicht übereinstimmenden Zeilen anzeigen
- –n: alle übereinstimmenden Zeilennummern anzeigen
- –l : Druckt die Dateinamen
- –-color: farbige Ergebnisausgabe
- –c: zeigt die Anzahl der Übereinstimmungen für das verwendete Muster an
#1. Suche nach einem ganzen Wort
Für die Suche nach einem ganzen Wort müssen Sie das Argument -w mit grep verwenden. Damit umgehen Sie alle Zeichenfolgen, die mit dem angegebenen Muster übereinstimmen.
$ grep -w 'tech\|5G' tech.txt

Wie Sie sehen, führt der Befehl zu einer Ausgabe, in der er im gesamten Text nach zwei Wörtern, “5G” und “tech”, sucht. Anschließend werden sie mit roter Farbe markiert.
Hier wird das | Pipe-Symbol escaped, damit grep es nicht als Metazeichen verarbeitet.
#2. Groß-/Kleinschreibung-unabhängige Suche
Um eine Suche ohne Berücksichtigung der Groß- und Kleinschreibung durchzuführen, verwenden Sie grep mit dem Argument -i .
$ grep -i 'tech' tech.txt

Der Befehl sucht nach jeder Instanz der Zeichenkette “tech”, unabhängig von der Groß- und Kleinschreibung, egal ob es sich um ein ganzes Wort oder einen Teil davon handelt.
#3. Eine Suche nach nicht übereinstimmenden Zeilen durchführen
Um alle Zeilen anzuzeigen, die ein bestimmtes Muster nicht enthalten, müssen Sie das Argument -v verwenden.
$ grep -v 'tech' tech.txt

Die Ausgabe zeigt alle Zeilen an, in denen das Wort“tech” nicht vorkommt Außerdem sehen Sie auch leere Zeilen. Diese Zeilen sind die Zeilen, die nach einem Absatz stehen.
#4. Eine rekursive Suche durchführen
Um eine rekursive Suche durchzuführen, verwenden Sie das Argument -r mit grep.
$ grep -R 'error\|warning' /var/log/*.log
#output
/var/log/bootstrap.log:2023-01-03 21:40:18 URL:http://ftpmaster.internal/ubuntu/pool/main/libg/libgpg-error/libgpg-erro 0_1.43-3_amd64.deb [69684/69684] -> "/build/chroot//var/cache/apt/archives/partial/libgpg-error0_1.43-3_amd64.deb" [1]
/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 5 package 'dpkg':
/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 5 package 'dpkg':
/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 24 package 'dpkg':
/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 24 package 'dpkg':
/var/log/bootstrap.log:dpkg: warning: ignoring pre-dependency problem!

Der Befehl grep sucht rekursiv nach zwei Wörtern, “error” und “warning”, im Verzeichnis /var/log. Dies ist ein praktischer Befehl, um sich über alle Warnungen und Fehler in den Protokolldateien zu informieren.
Grep und Regex: Was es ist und Beispiele
Da wir mit regex arbeiten, müssen Sie wissen, dass regex drei Syntaxoptionen bietet. Dazu gehören:
- Einfache reguläre Ausdrücke (BRE)
- Erweiterte reguläre Ausdrücke (ERE)
- Pearl-kompatible reguläre Ausdrücke (PCRE)
Der Befehl grep verwendet BRE als Standardoption. Wenn Sie also andere Regex-Modi verwenden möchten, müssen Sie diese angeben. Der Befehl grep behandelt auch Metazeichen so, wie sie sind. Wenn Sie also Metazeichen wie ?, , ) verwenden, müssen Sie diese mit dem Befehl backslash (\) ausschließen.
Die Syntax von grep mit regex lautet wie folgt.
$ grep [regex] [Dateinamen]
Lassen Sie uns grep und regex anhand der folgenden Beispiele in Aktion sehen.
#1. Wörtliche Wortübereinstimmungen
Für eine wörtliche Wortübereinstimmung müssen Sie eine Zeichenkette als regex angeben. Schließlich ist ein Wort auch ein Regex.
$ grep "technologien" tech.txt

Auf ähnliche Weise können Sie auch wörtliche Übereinstimmungen verwenden, um aktuelle Benutzer zu finden. Führen Sie dazu aus,
$ grep bash /etc/passwd
#Ausgabe
root:x:0:0:root:/root:/bin/bash
nitt:x:1000:1000:,,,:/home/nitt:/bin/bash

Dies zeigt die Benutzer an, die auf die Bash zugreifen können.
#2. Anker-Übereinstimmung
Die Ankerübereinstimmung ist eine nützliche Technik für erweiterte Suchen mit Sonderzeichen. In regex gibt es verschiedene Ankerzeichen, die Sie verwenden können, um bestimmte Positionen innerhalb eines Textes darzustellen. Dazu gehören:
- ‘^’ Caret-Symbol: Das Caret-Symbol entspricht dem Anfang der Eingabezeichenfolge oder -zeile und sucht nach einer leeren Zeichenfolge.
- ‘$’ Dollar-Symbol: Das Dollar-Symbol entspricht dem Ende der Eingabezeichenfolge oder -zeile und sucht nach einer leeren Zeichenfolge.
Zu den beiden anderen Ankerzeichen gehören die Wortgrenze ‘\ b’ und die Nicht-Wortgrenze ‘\ B’.
- ‘\ b’ Wortgrenze: Mit \b können Sie die Position zwischen einem Wort und einem Nicht-Wort-Zeichen bestimmen. In einfachen Worten: Sie können damit komplette Wörter abgleichen. Auf diese Weise können Sie partielle Übereinstimmungen vermeiden. Sie können es auch verwenden, um Wörter zu ersetzen oder das Vorkommen von Wörtern in einer Zeichenfolge zu zählen.
- \B Nicht-Wort-Grenze: Sie ist das Gegenteil der \b Wort-Grenze in Regex, da sie eine Position behauptet, die nicht zwischen zwei Wort- oder Nicht-Wort-Zeichen liegt.
Gehen wir die Beispiele durch, um eine klare Vorstellung zu bekommen.
$ grep '^From' tech.txt

Die Verwendung von caret erfordert die Eingabe des Wortes oder Musters in der richtigen Groß- und Kleinschreibung. Das liegt daran, dass die Groß- und Kleinschreibung beachtet wird. Wenn Sie also den folgenden Befehl ausführen, wird er nichts zurückgeben.
$ grep '^from' tech.txt
Auf ähnliche Weise können Sie das Symbol $ verwenden, um den Satz zu finden, der mit einem bestimmten Muster, einer Zeichenkette oder einem Wort übereinstimmt.
$ grep 'technologie.$' tech.txt

Sie können die beiden Symbole ^ und $ auch kombinieren. Sehen wir uns das folgende Beispiel an.
$ grep "^Von \|Technologie.$" tech.txt

Wie Sie sehen können, enthält die Ausgabe Sätze, die mit “From” beginnen und Sätze, die mit “technology” enden
#3. Gruppieren
Wenn Sie mehrere Muster auf einmal durchsuchen möchten, müssen Sie die Gruppierung verwenden. Damit können Sie kleine Gruppen von Zeichen und Mustern erstellen, die Sie als eine Einheit behandeln können. Sie können zum Beispiel eine Gruppe (tech) erstellen, die die Begriffe ‘t’, ‘e’, ‘c’ und ‘h’ enthält
Um eine klare Vorstellung zu bekommen, sehen wir uns ein Beispiel an.
$ grep 'technol\(ogy\)\?' tech.txt

Mit der Gruppierung können Sie wiederholte Muster abgleichen, Gruppen erfassen und nach Alternativen suchen.
Alternativsuche mit Gruppierung
Sehen wir uns ein Beispiel für eine alternative Suche an.
$ grep "\(tech\|technology\)" tech.txt

Wenn Sie eine Suche nach einer Zeichenkette durchführen möchten, müssen Sie diese mit dem Pipe-Symbol übergeben. Lassen Sie uns das im folgenden Beispiel sehen.
$ echo "tech technologische Technologien technische" | grep "\(tech\|technology\)"
#Ausgabe
"tech technologisch Technologien technisch"

Erfassende Gruppen, nicht-erfassende Gruppen und wiederholte Patterns
Und was ist mit erfassenden und nicht-erfassenden Gruppen?
Sie müssen eine Gruppe in der Regex erstellen und diese an den String oder eine Datei für die Erfassung von Gruppen übergeben.
$ echo 'tech655 tech655nical technologies655 tech655-oriented 655' | grep "\(tech\)\(655\)"
#Ausgabe
tech655 tech655nische Technologien655 tech655-orientierte 655

Und für nicht-erfassende Gruppen müssen Sie das ?: innerhalb der Klammern verwenden.
Und schließlich haben wir wiederholte Muster. Sie müssen die Regex ändern, um nach wiederholten Mustern zu suchen.
$ echo 'teach tech ttrial tttechno attest' | grep '\(t\ \)'
#Ausgabe
'teach tech ttrial tttechno attest'
Hier sucht die Regex nach einer oder mehreren Instanzen des Zeichens ‘t’.
#4. Zeichenklassen
Mit Zeichenklassen können Sie ganz einfach Regex-Ausdrücke schreiben. Diese Zeichenklassen verwenden eckige Klammern. Einige der bekannten Zeichenklassen sind:
- [:digit:] – 0 bis 9 Ziffern
- [:alpha:] – alphabetische Zeichen
- [:alnum:] – alphanumerische Zeichen
- [:lower:] – Kleinbuchstaben
- [:upper:] – Großbuchstaben
- [:xdigit:] – hexadezimale Ziffern, einschließlich 0-9, A-F, a-f
- [:blank:] – Leerzeichen wie Tabulator oder Leerzeichen
Und so weiter!
Lassen Sie uns ein paar davon in Aktion sehen.
$ grep [[:Ziffer]] tech.txt

$ grep [[:alpha:]] tech.txt

$ grep [[:xdigit:]] tech.txt

#5. Quantifizierer
Quantifizierer sind Metazeichen und bilden den Kern von regex. Mit ihnen können Sie exakte Erscheinungen abgleichen. Schauen wir sie uns im Folgenden an.
- * → Null oder mehr Übereinstimmungen
- → eine oder mehrere Übereinstimmungen
- ? → Null oder eine Übereinstimmung
- {x} → x Übereinstimmungen
- {x, } → x oder mehr Übereinstimmungen
- {x,z} → von x bis z Übereinstimmungen
- {, z} → bis zu z Übereinstimmungen
$ echo 'teach tech ttrial tttechno attest' | grep -E 't '
#Ausgabe
'teach tech ttrial tttechno attest'
Hier wird nach den Instanzen des Zeichens‘t’ nach einer oder mehreren Übereinstimmungen gesucht. Dabei steht -E für eine erweiterte Regex (die wir später noch besprechen werden.)

#6. Erweiterte Regex
Wenn Sie keine Escape-Zeichen in das Regex-Muster einfügen möchten, müssen Sie Extended Regex verwenden. Damit entfällt die Notwendigkeit, Escape-Zeichen hinzuzufügen. Dazu müssen Sie das Flag -E verwenden.
$ grep -E 'in ovation' tech.txt

#7. Verwendung von PCRE für komplexe Suchvorgänge
Mit PCRE (Perl Compatible Regular Expression) können Sie viel mehr tun als nur einfache Ausdrücke zu schreiben. Sie können zum Beispiel “\d” schreiben, was [0-9] bedeutet.
Sie können PCRE zum Beispiel verwenden, um nach E-Mail-Adressen zu suchen.
echo "Kontaktieren Sie mich unter nitish@newdomain.com" | grep -P "\b[A-Za-z0-9._% -] @[A-Za-z0-9.-] \.[A-Za-z]{2,}\b"
#output
Kontaktieren Sie mich unter nitish@newdomain.com

Hier stellt PCRE sicher, dass das Muster übereinstimmt. Auf ähnliche Weise können Sie auch ein PCRE-Muster verwenden, um nach Datumsmustern zu suchen.
$ echo "Die Sparkain-Website wurde am 2023-07-29 gestartet" | grep -P "\b\d{4}-\d{2}-\d{2}\b"
#Ausgabe
Die Sparkain-Website wurde am 2023-07-29 gestartet

Der Befehl findet das Datum im Format JJJJ-MM-TT. Sie können ihn auch an andere Datumsformate anpassen.
#8. Abwechslung
Wenn Sie alternative Übereinstimmungen wünschen, können Sie die escapeten Pipe-Zeichen (\|) verwenden.
$ grep -L 'warning\|error' /var/log/*.log
#output
/var/log/alternatives.log
/var/log/bootstrap.log
/var/log/dpkg.log
/var/log/fontconfig.log
/var/log/ubuntu-advantage.log
/var/log/upgrade-policy-changed.log
Die Ausgabe listet die Dateinamen auf, die “Warnung” oder “Fehler” enthalten

Letzte Worte
Damit sind wir am Ende unserer grep und regex Anleitung angelangt. Sie können grep mit regex ausgiebig verwenden, um Ihre Suche zu verfeinern. Bei richtiger Anwendung können Sie viel Zeit sparen und viele Aufgaben automatisieren, insbesondere wenn Sie damit Skripte schreiben oder die regex bei der Suche im Text verwenden.
Als nächstes sehen Sie sich die häufig gestellten Fragen und Antworten zu Linux-Interviews an.