Reguläre Ausdrücke (Regex) erweitern grep von einem einfachen Suchwerkzeug zu einem mächtigen Textfilter. Statt nur nach festen Zeichenketten zu suchen, definierst du Muster, die auf verschiedene Textvarianten passen.

Regex-Modi in grep

GNU grep unterstützt drei Regex-Syntaxen:

  • Basic Regular Expressions (BRE) - Standard ohne Optionen
  • Extended Regular Expressions (ERE) - Mit der Option -E
  • Perl-kompatible Ausdrücke (PCRE) - Mit der Option -P

Der Hauptunterschied zwischen BRE und ERE: Bei einfachen regulären Ausdrücken musst du die Metazeichen ?, +, {, |, ( und ) mit einem Backslash escapen. Bei erweiterten Ausdrücken funktionieren sie direkt.

Schließe Regex-Muster immer in einfache Anführungszeichen ein. Das verhindert, dass die Shell Sonderzeichen interpretiert:

grep 'muster' datei.txt

Literale Suche

Die einfachste Form ist die Suche nach einer exakten Zeichenkette:

grep bash /etc/passwd

Ausgabe:

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

Standardmäßig unterscheidet grep zwischen Groß- und Kleinschreibung. Mit -i hebst du das auf:

grep -i 'error' /var/log/syslog

Beachte: grep sucht nach Teilzeichenketten. Die Suche nach “log” findet auch “login” oder “catalog”.

Anker: Position im Text bestimmen

Anker legen fest, wo im Text das Muster stehen muss.

Zeilenanfang mit ^

Das Caret-Zeichen ^ verankert das Muster am Zeilenanfang:

grep '^root' /etc/passwd

Findet nur Zeilen, die mit “root” beginnen - nicht “webroot” oder “chroot”.

Zeilenende mit $

Das Dollar-Zeichen $ verankert am Zeilenende:

grep 'bash$' /etc/passwd

Findet Zeilen, die mit “bash” enden.

Kombination beider Anker

Für Zeilen, die nur ein bestimmtes Muster enthalten:

grep '^linux$' datei.txt

Ein praktisches Muster ist ^$ - es findet alle leeren Zeilen:

grep -c '^$' datei.txt

Der Punkt: Ein beliebiges Zeichen

Der Punkt . steht für genau ein beliebiges Zeichen:

grep 'k..e' datei.txt

Findet “knie”, “kate”, “kode” und jede andere Kombination mit beliebigen zwei Zeichen zwischen k und e.

Zeichenklassen mit eckigen Klammern

Eckige Klammern definieren eine Gruppe von Zeichen, von denen eines passen muss:

grep 'acce[np]t' datei.txt

Findet “accent” und “accept”, aber nicht “accert”.

Negierte Zeichenklassen

Mit ^ direkt nach der öffnenden Klammer schließt du Zeichen aus:

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

Findet “coca”, “coda”, aber nicht “cola”.

Bereiche angeben

Statt einzelne Zeichen aufzulisten, kannst du Bereiche definieren:

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

Findet Zeilen, die mit einem Großbuchstaben beginnen. Weitere Bereiche:

  • [a-z] - Kleinbuchstaben
  • [0-9] - Ziffern
  • [A-Za-z] - Alle Buchstaben

Vordefinierte Zeichenklassen

grep kennt POSIX-Zeichenklassen für häufige Muster:

KlasseBedeutung
[:alnum:]Alphanumerische Zeichen
[:alpha:]Buchstaben
[:digit:]Ziffern
[:lower:]Kleinbuchstaben
[:upper:]Großbuchstaben
[:space:]Whitespace

Diese Klassen stehen innerhalb zusätzlicher Klammern:

grep '[[:digit:]]' datei.txt

Quantifizierer: Anzahl der Wiederholungen

Quantifizierer bestimmen, wie oft ein Element vorkommen darf.

Der Stern: Null oder mehr

Das Sternchen * passt auf null oder mehr Vorkommen des vorherigen Elements:

grep 'ab*c' datei.txt

Findet “ac”, “abc”, “abbc”, “abbbc” und so weiter.

Ein häufiges Muster ist .* - es passt auf beliebig viele beliebige Zeichen:

grep -E '^[A-Z].*\.$' datei.txt

Findet Zeilen, die mit Großbuchstaben beginnen und mit einem Punkt enden.

Das Fragezeichen: Optional

Das ? macht das vorherige Element optional (null oder ein Mal):

grep -E 'colou?r' datei.txt

Findet sowohl “color” als auch “colour”.

Bei Basic Regex musst du escapen:

grep 'colou\?r' datei.txt

Das Plus: Mindestens einmal

Das + erfordert mindestens ein Vorkommen:

grep -E 'ab+c' datei.txt

Findet “abc”, “abbc”, aber nicht “ac”.

Geschweifte Klammern: Exakte Anzahl

Mit {n} legst du eine genaue Anzahl fest:

grep -E '[0-9]{4}' datei.txt

Findet vierstellige Zahlenfolgen.

Weitere Varianten:

SyntaxBedeutung
{n}Genau n Mal
{n,}Mindestens n Mal
{,m}Höchstens m Mal
{n,m}Zwischen n und m Mal
grep -E '[[:digit:]]{3,5}' datei.txt

Findet Zahlenfolgen mit 3 bis 5 Ziffern.

Alternation: ODER-Verknüpfung

Der Pipe-Operator | verknüpft Alternativen:

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

Findet Zeilen mit mindestens einem der Wörter. Mit Basic Regex:

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

Gruppierung mit Klammern

Klammern fassen Teile eines Musters zusammen. Das ist nützlich für Quantifizierer auf Wortteilen:

grep -E '(ab)+c' datei.txt

Findet “abc”, “ababc”, “abababc” - das “ab” muss mindestens einmal vorkommen.

Ein praktisches Beispiel:

grep -E '(un)?möglich' datei.txt

Findet sowohl “möglich” als auch “unmöglich”.

Wortgrenzen mit Backslash-Ausdrücken

GNU grep kennt spezielle Backslash-Sequenzen:

AusdruckBedeutung
\bWortgrenze
\<Wortanfang
\>Wortende
\wWortzeichen (Buchstabe, Ziffer, Unterstrich)
\sWhitespace

Mit \b findest du ganze Wörter:

grep '\bthe\b' datei.txt

Findet “the”, aber nicht “there” oder “other”. Die Option -w macht dasselbe:

grep -w 'the' datei.txt

Praktische Beispiele

IP-Adressen finden

grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /var/log/auth.log

E-Mail-Adressen extrahieren

grep -Eo '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}' datei.txt

Die Option -o gibt nur den Treffer selbst aus.

Kommentarzeilen in Konfigurationsdateien finden

grep '^#' /etc/ssh/sshd_config

Nicht-Kommentarzeilen in Konfigurationsdateien

grep -v '^#' /etc/ssh/sshd_config | grep -v '^$'

Filtert Kommentare und leere Zeilen heraus.

Zeilen mit einer bestimmten Wortanzahl

grep -E '^\S+\s+\S+\s+\S+$' datei.txt

Findet Zeilen mit genau drei Wörtern.

Zusammenfassung

Reguläre Ausdrücke machen grep zu einem flexiblen Suchwerkzeug. Die wichtigsten Bausteine sind Anker (^, $), Zeichenklassen ([]), Quantifizierer (*, +, ?, {}) und Gruppierungen (()). Mit der Option -E ersparst du dir das Escapen von Sonderzeichen. Für komplexe Muster bietet -P die volle Perl-Regex-Syntax.

Verwandte Artikel