Der Befehl grep durchsucht Dateien nach Textmustern und gibt alle Zeilen aus, die das gesuchte Muster enthalten. Der Name steht für “global regular expression print” und beschreibt genau das: globale Suche mit regulären Ausdrücken.

Syntax

grep [OPTIONEN] MUSTER [DATEI...]
  • OPTIONEN - Flags, die das Suchverhalten steuern
  • MUSTER - Der Suchbegriff oder reguläre Ausdruck
  • DATEI - Eine oder mehrere Dateien, die durchsucht werden sollen

Ohne Dateiangabe liest grep von der Standardeingabe. Das ermöglicht die Verwendung in Pipes mit anderen Befehlen.

Einfache Textsuche

Die grundlegendste Anwendung ist die Suche nach einer Zeichenkette in einer Datei:

grep bash /etc/passwd

Der Befehl gibt alle Zeilen aus, die “bash” enthalten:

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

Bei Suchbegriffen mit Leerzeichen verwendest du Anführungszeichen:

grep "Display Manager" /etc/passwd

Groß- und Kleinschreibung ignorieren

Standardmäßig unterscheidet grep zwischen Groß- und Kleinschreibung. Mit der Option -i wird diese Unterscheidung aufgehoben:

grep -i fehler /var/log/syslog

Dieser Befehl findet “Fehler”, “FEHLER”, “fehler” und alle anderen Schreibweisen.

Suche invertieren

Mit der Option -v zeigt grep alle Zeilen an, die das Muster nicht enthalten:

grep -v nologin /etc/passwd

Das ist praktisch, um bestimmte Einträge aus einer Liste auszuschließen.

Rekursive Suche in Verzeichnissen

Mit -r durchsucht grep alle Dateien in einem Verzeichnis und dessen Unterverzeichnissen:

grep -r "server_name" /etc/nginx/

Die Ausgabe enthält den Dateipfad vor jeder Fundstelle:

/etc/nginx/sites-available/example.conf:    server_name example.org;

Die Option -R funktioniert ähnlich, folgt aber auch symbolischen Links.

Nur Dateinamen anzeigen

Wenn dich nur interessiert, welche Dateien das Muster enthalten, verwende -l:

grep -l "TODO" *.py

Der Befehl listet alle Python-Dateien im aktuellen Verzeichnis auf, die “TODO” enthalten. In Kombination mit -r durchsuchst du ganze Projektverzeichnisse:

grep -rl "deprecated" /home/max/projekt/

Zeilennummern anzeigen

Mit -n zeigt grep die Zeilennummer vor jedem Treffer:

grep -n "error" /var/log/nginx/error.log

Ausgabe:

142:2025/01/15 10:23:45 [error] connection refused
289:2025/01/15 11:45:12 [error] upstream timeout

Treffer zählen

Die Option -c gibt nur die Anzahl der übereinstimmenden Zeilen aus:

grep -c "failed" /var/log/auth.log

Das ist nützlich für schnelle Statistiken oder zur Verwendung in Skripten.

Ganze Wörter suchen

Ohne weitere Optionen findet grep auch Teilübereinstimmungen. Die Suche nach “log” findet auch “login”, “catalog” oder “logout”. Mit -w werden nur ganze Wörter gefunden:

grep -w "log" datei.txt

Kontext anzeigen

Manchmal brauchst du mehr als nur die Trefferzeile. Die Optionen -A, -B und -C zeigen Kontext:

  • -A 3 zeigt 3 Zeilen nach dem Treffer (After)
  • -B 3 zeigt 3 Zeilen vor dem Treffer (Before)
  • -C 3 zeigt 3 Zeilen vor und nach dem Treffer (Context)
grep -C 2 "Exception" /var/log/app.log

Mehrere Muster suchen

Mit -E aktivierst du erweiterte reguläre Ausdrücke. Der Pipe-Operator | verbindet mehrere Muster mit ODER:

grep -E "error|warning|critical" /var/log/syslog

Alternativ kannst du mehrere -e Optionen verwenden:

grep -e "error" -e "warning" /var/log/syslog

Ausgabe anderer Befehle filtern

Eine häufige Anwendung ist das Filtern von Befehlsausgaben durch Pipes:

ps aux | grep nginx

Dieser Befehl zeigt alle laufenden Prozesse, die “nginx” im Namen haben. Ein kleiner Haken: Der grep-Prozess selbst taucht oft in der Ausgabe auf. Das lässt sich umgehen:

ps aux | grep nginx | grep -v grep

Oder eleganter mit einem Zeichenklassen-Trick:

ps aux | grep "[n]ginx"

Reguläre Ausdrücke

grep unterstützt reguläre Ausdrücke für komplexe Suchmuster:

ZeichenBedeutung
^Zeilenanfang
$Zeilenende
.Ein beliebiges Zeichen
*Null oder mehr Wiederholungen
[abc]Eines der Zeichen a, b oder c
[^abc]Keines der Zeichen a, b oder c

Zeilen finden, die mit “Error” beginnen:

grep "^Error" logdatei.txt

Zeilen finden, die mit einem Punkt enden:

grep "\.$" datei.txt

Der Backslash entwertet die besondere Bedeutung des Punktes.

Verwendung in Skripten

Mit der Option -q (quiet) unterdrückt grep jede Ausgabe und liefert nur einen Rückgabewert. Das ist ideal für Bedingungen in Skripten:

if grep -q "FEHLER" /var/log/app.log; then
    echo "Fehler gefunden"
else
    echo "Keine Fehler"
fi

Der Rückgabewert ist 0 bei mindestens einem Treffer und 1 ohne Treffer.

Häufig verwendete Optionen

OptionBedeutung
-iGroß-/Kleinschreibung ignorieren
-vZeilen ohne Treffer anzeigen
-rRekursiv in Verzeichnissen suchen
-lNur Dateinamen ausgeben
-nZeilennummern anzeigen
-cTreffer zählen
-wNur ganze Wörter
-EErweiterte reguläre Ausdrücke
-oNur den Treffer selbst ausgeben
-A nn Zeilen nach dem Treffer
-B nn Zeilen vor dem Treffer

Zusammenfassung

Der Befehl grep ist ein vielseitiges Werkzeug zum Durchsuchen von Dateien und Filtern von Ausgaben. Mit regulären Ausdrücken lassen sich auch komplexe Suchmuster formulieren. In Kombination mit anderen Befehlen über Pipes gehört grep zu den meistgenutzten Werkzeugen auf der Kommandozeile.

Verwandte Artikel