VMware ESXi and vSphere Cluster Management
Mit grep Text in Dateien und Befehlsausgaben suchen
Lerne grep unter Linux: Suche in Dateien und Verzeichnissen, rekursive Suche, Groß-/Kleinschreibung, Worttreffer und Pipelines mit praktischen Beispielen.
grep ist ein Kommandozeilenprogramm zum Durchsuchen und Filtern von Text. Es prüft Zeilen gegen ein Muster und gibt normalerweise die vollständigen Zeilen aus, die zu diesem Muster passen. Dadurch lassen sich Dateien, Verzeichnisbäume und auch die Ausgaben anderer Befehle schnell untersuchen.
In dieser Lektion lernst du die wichtigsten Grundlagen von grep: die Syntax, die Suche in einzelnen Dateien, rekursive Suchen, Optionen für die Schreibweise und Wortgrenzen sowie die Verwendung von Pipes.
Wofür wird grep verwendet?
Ein Muster ist der Suchausdruck, nach dem grep sucht. Das kann einfacher Text wie bob oder später auch ein regulärer Ausdruck sein. Eine Zeile, deren Inhalt zum Muster passt, ist ein Treffer.
grep sucht im Inhalt von Dateien. Es sucht nicht danach, welche Dateien einen bestimmten Namen besitzen. Für eine Suche nach Dateinamen oder Dateieigenschaften ist beispielsweise find das passendere Werkzeug:
find /home/bob -name '*.txt'
Der Befehl find sucht hier nach Dateien mit der Endung .txt. grep würde dagegen den Inhalt zugänglicher Dateien nach Text durchsuchen.
Standardmäßig gibt grep die komplette Textzeile aus, in der es einen Treffer findet. Es gibt also nicht nur das einzelne Suchwort aus. Enthält eine Datei beispielsweise die Zeile Bob arbeitet im Büro., kann die Suche nach bob diese Zeile nur dann finden, wenn die Groß-/Kleinschreibung berücksichtigt wird oder -i verwendet wird.
Grundsyntax
grep [OPTIONEN] MUSTER [DATEI ...]
- OPTIONEN verändern das Verhalten von grep. Beispiele sind
-rfür rekursive Suche und-ifür eine Suche ohne Beachtung der Groß-/Kleinschreibung. - MUSTER ist der gesuchte Text oder reguläre Ausdruck.
- DATEI ... steht für eine oder mehrere Eingabedateien. Die eckigen Klammern zeigen an, dass dieser Teil optional ist.
Wird keine Datei angegeben, liest grep aus der Standardeingabe. Das ist eine Textquelle, die ein Programm ohne explizite Datei verwenden kann. Häufig stammt sie von einem vorherigen Befehl in einer Pipeline.
In einer einzelnen Datei suchen
Mit diesem Befehl suchst du nach dem Text bob in bobs_file.txt:
grep 'bob' bobs_file.txt
Als Ergebnis erscheint jede Zeile aus bobs_file.txt, die das Muster enthält. Der Dateiname ist hier nicht unbedingt Teil der Ausgabe, weil nur eine Datei angegeben wurde.
Das Muster und der Dateiname haben unterschiedliche Aufgaben:
'bob'beschreibt, wonach gesucht wird.bobs_file.txtbeschreibt, wo gesucht wird.
Die einfachen Anführungszeichen schützen das Muster vor der Shell. Das ist besonders wichtig bei Leerzeichen und Shell-Sonderzeichen. Auch ein einfacher Text sollte grundsätzlich in Anführungszeichen stehen:
grep 'error while loading' application.log
Ohne Anführungszeichen würde die Shell das Leerzeichen als Trennzeichen behandeln und grep mehrere Argumente erhalten.
Zeilennummern ausgeben
Mit -n ergänzt grep jeden Treffer um die Zeilennummer:
grep -n 'bob' bobs_file.txt
Eine Ausgabe wie 12:Bob arbeitet im Büro. bedeutet, dass die passende Zeile die Nummer 12 besitzt. Die genaue Schreibweise der Ausgabe kann je nach grep-Version und Optionen variieren.
Wichtige grep-Optionen
| Option | Wirkung | Beispiel |
|---|---|---|
-r | Durchsucht ein Verzeichnis rekursiv einschließlich seiner Unterverzeichnisse. | grep -r 'bob' /home/bob |
-i | Ignoriert bei der Suche die Groß-/Kleinschreibung. | grep -i 'bob' bobs_file.txt |
-w | Sucht nach vollständigen Wörtern statt nach beliebigen Teiltreffern. | grep -w 'bob' bobs_file.txt |
-n | Zeigt zusätzlich die Zeilennummer an. | grep -n 'bob' bobs_file.txt |
-v | Zeigt Zeilen an, die nicht zum Muster passen. | grep -v 'debug' application.log |
Groß- und Kleinschreibung
Standardmäßig unterscheidet grep zwischen Groß- und Kleinschreibung. Eine Suche nach bob findet daher normalerweise nicht automatisch Bob oder BOB.
grep 'bob' bobs_file.txt
Mit der Option -i wird die Schreibweise ignoriert:
grep -i 'bob' bobs_file.txt
Damit werden Zeilen berücksichtigt, die beispielsweise bob, Bob oder BOB enthalten.
Teiltreffer und vollständige Wörter
Ein einfaches Muster wird normalerweise auch innerhalb eines längeren Wortes gefunden. Die Suche nach bob kann deshalb neben bob auch bobcat treffen.
Wenn nur das eigenständige Wort gesucht werden soll, verwendest du -w:
grep -w 'bob' bobs_file.txt
Diese Variante vermeidet typische Teiltreffer wie bobcat. Für noch genauere Regeln können reguläre Ausdrücke verwendet werden. Ein regulärer Ausdruck ist eine eigene Mustersprache, mit der sich beispielsweise Zeichenklassen, Wiederholungen oder Zeilenanfänge beschreiben lassen. Für die ersten grep-Suchen reicht einfacher Text meist aus.
Rekursiv in Verzeichnissen suchen
Mit -r durchsucht grep ein Startverzeichnis und alle darin enthaltenen Unterverzeichnisse. Eine rekursive Suche ist also eine Suche, die einen Verzeichnisbaum vollständig unterhalb eines Startpunkts durchläuft.
grep -r 'bob' /home/bob
Bei einer Suche in mehreren Dateien ordnet grep die Treffer normalerweise über den Dateinamen zu. Eine Ausgabe kann beispielsweise so aussehen:
/home/bob/notizen.txt:Bob arbeitet im Büro.
/home/bob/projekte/planung.txt:Das Projekt wird von Bob betreut.
Der Teil vor dem Doppelpunkt ist der Dateiname, danach folgt die passende vollständige Zeile. So kannst du erkennen, aus welcher Datei jeder Treffer stammt.
Bei großen Verzeichnisbäumen solltest du mit längeren Laufzeiten und vielen Treffern rechnen. Außerdem können folgende Situationen auftreten:
- Für manche Dateien fehlen Leseberechtigungen. grep kann dann eine Fehlermeldung ausgeben.
- Binärdateien enthalten keinen gewöhnlichen lesbaren Text. grep kann sie als Binärdateien erkennen und die Ausgabe entsprechend abkürzen oder kennzeichnen.
- Temporäre Dateien, Cache-Verzeichnisse oder Abhängigkeiten können sehr viele unerwartete Treffer erzeugen.
Beginne deshalb möglichst mit einem passenden, kleinen Startpfad. Prüfe bei Berechtigungsfehlern, ob du wirklich in diesem Bereich suchen musst und ob dein Benutzer die Dateien lesen darf.
Ausgaben anderer Befehle mit einer Pipe filtern
Das Zeichen | heißt Pipe. Es übergibt die Standardausgabe eines Befehls als Standardeingabe an den nächsten Befehl. Dadurch kann grep eine lange Befehlsausgabe auf relevante Zeilen reduzieren.
Gruppeninformationen filtern
cat /etc/group | grep 'cdrom'
cat /etc/group gibt den Inhalt der Datei aus. Die Pipe übergibt diesen Inhalt an grep. Ausgegeben wird nur die Zeile, die das Muster cdrom enthält, beispielsweise der Eintrag der Gruppe mit ihren zugehörigen Informationen.
Für diesen konkreten Fall kann grep die Datei auch direkt lesen:
grep 'cdrom' /etc/group
Beide Varianten verdeutlichen das Prinzip. Die direkte Form ist kürzer, wenn keine zusätzliche Verarbeitung durch cat nötig ist.
Prozessliste filtern
ps -A | grep 'top'
ps -A zeigt eine vollständige Prozessliste an. grep gibt anschließend die Prozesszeilen aus, deren Text top enthält. Eine Zeile enthält typischerweise eine Prozess-ID, weitere Status- oder Zeitangaben und den Befehlsnamen.
Mehrere Treffer können mehrere laufende Instanzen eines Programms bedeuten. Sie können aber auch entstehen, weil das Muster in weiteren Teilen der kompletten Prozesszeile vorkommt. Die Ausgabe muss daher als Textfilter verstanden und bei Bedarf genauer geprüft werden.
Dateisuche und Pipe im Vergleich
| Eingabequelle | Befehlsform | Typischer Einsatzzweck |
|---|---|---|
| Direkte Datei | grep 'MUSTER' datei.txt | Textmuster in einer einzelnen Datei suchen. |
| Verzeichnisstruktur | grep -r 'MUSTER' /pfad | Dateien unterhalb eines Startverzeichnisses einschließlich Unterordnern durchsuchen. |
| Ausgabe eines anderen Befehls | befehl | grep 'MUSTER' | Lange Standardausgaben auf passende Zeilen reduzieren. |
Sicher und sinnvoll suchen
Muster in Anführungszeichen setzen
Setze Suchmuster in einfache Anführungszeichen. Das schützt Leerzeichen und viele Sonderzeichen davor, von der Shell interpretiert zu werden:
grep 'connection failed' application.log
Wenn du reguläre Ausdrücke verwendest, haben manche Zeichen zusätzlich eine besondere Bedeutung für grep. Prüfe deshalb, ob du ein Zeichen wörtlich oder als Teil einer Mustersprache verwenden möchtest.
Startpfad und Berechtigungen prüfen
Bei einer rekursiven Suche ist der Startpfad entscheidend. Ein falscher oder zu großer Pfad führt entweder zu keinen passenden Ergebnissen oder zu sehr vielen Dateien. Fehlende Leseberechtigungen können Meldungen wie „Permission denied“ verursachen. Das bedeutet nicht zwingend, dass das Muster nicht existiert, sondern zunächst nur, dass grep bestimmte Inhalte nicht lesen konnte.
Prozessausgaben nicht blind interpretieren
Eine Prozesszeile ist eine Textzeile, die zum Suchmuster passt. Sie beweist allein nicht immer, dass exakt der gewünschte Programmname gefunden wurde. Bei ps -A | grep 'top' können auch Argumente oder der grep-Aufruf selbst das Muster enthalten. Für eine zuverlässige Auswertung müssen die ganze Zeile und gegebenenfalls die Prozess-ID betrachtet werden.
Typische Probleme und Lösungen
Keine Treffer trotz sichtbarer anderer Schreibweise
Ursache: grep unterscheidet standardmäßig zwischen Groß- und Kleinschreibung.
grep -i 'bob' bobs_file.txt
Prüfe zusätzlich den Dateipfad und ob der Begriff wirklich im Dateiinhalt steht.
Treffer aus Unterordnern fehlen
Ursache: Ohne -r durchsucht grep nicht automatisch den gesamten Verzeichnisbaum.
grep -r 'bob' /home/bob
Verwende den richtigen Startpfad und beachte mögliche Berechtigungsfehler.
Zu viele oder unerwartete Treffer
Ursache: Ein einfacher Textausdruck findet auch Teilwörter.
grep -w 'bob' bobs_file.txt
Mit -w suchst du nach einem eigenständigen Wort. Für kompliziertere Anforderungen formulierst du ein präziseres Muster, gegebenenfalls als regulären Ausdruck.
Muster mit Leerzeichen liefert ein unerwartetes Ergebnis
Ursache: Die Shell verarbeitet ungeschützte Leerzeichen und Sonderzeichen, bevor grep gestartet wird.
Lösung: Setze das Muster in einfache Anführungszeichen und prüfe bei regulären Ausdrücken die gewünschte Bedeutung der Sonderzeichen.
Eine zusätzliche grep-Zeile erscheint bei der Prozesssuche
Ursache: Der grep-Befehl selbst kann in der Prozessliste stehen.
Lösung: Ordne diese Zeile als möglichen Suchbefehl ein und untersuche die übrigen Prozesszeilen. Bei anspruchsvolleren Prozessabfragen sind speziellere Werkzeuge oder genauere Muster sinnvoll.
Übungen zum Nachvollziehen
- Suche in
bobs_file.txtnach dem Textbob. - Wiederhole die Suche mit
-iund vergleiche die Treffer. - Verwende
-n, um die Zeilennummern anzuzeigen. - Durchsuche mit
-rden Verzeichnisbaum unterhalb von/home/bob. - Filtere mit
ps -A | grep 'top'die Prozessliste und prüfe, ob mehrere Treffer unterschiedliche Prozess-IDs besitzen.
Das Wichtigste im Überblick
- grep durchsucht Dateiinhalt oder Standardeingabe nach Mustern.
- Ohne weitere Optionen gibt grep vollständige passende Zeilen aus.
-rdurchsucht Verzeichnisse rekursiv.-iignoriert Groß- und Kleinschreibung.-wverhindert viele Teiltreffer und sucht vollständige Wörter.- Mit
|wird die Ausgabe eines Befehls an grep weitergegeben. findist für die Suche nach Dateinamen und Eigenschaften gedacht, grep für den Inhalt.