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:
| Klasse | Bedeutung |
|---|---|
[: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:
| Syntax | Bedeutung |
|---|---|
{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:
| Ausdruck | Bedeutung |
|---|---|
\b | Wortgrenze |
\< | Wortanfang |
\> | Wortende |
\w | Wortzeichen (Buchstabe, Ziffer, Unterstrich) |
\s | Whitespace |
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.