Der grep-Befehl kann in Linux viel Zeit und Arbeit sparen, wenn man die „Stringsuche“ richtig einsetzt. Wie das geht, zeigen wir euch hier mit praktischen Beispielen und Tipps.
- 1.Was macht der grep-Befehl in Linux?
- 2.Dateien mit grep nach bestimmten Textinhalt durchsuchen
- 3.Dateien mit grep durchsuchen, die den Textinhalt NICHT enthalten
- 4.Mit grep nur die Trefferanzahl anzeigen lassen
- 5.Zeilennummer der gefundenen Textstelle mit ausgeben
- 6.Mit grep nur ganze Wörter finden wie „ein“, aber nicht „Stein“
- 7.Terminal-Befehlsausgaben mit grep filtern
Was macht der grep-Befehl in Linux?
Der Linux-Befehl „grep“ ist eine Abkürzung für „global regular expression print“. Er sucht im Terminal also nach bestimmten Textstücken, die auf die angegebene „Regular Expression“ passen. Das heißt: Der Befehl durchsucht beispielsweise Dateien auf eurem Rechner, kann aber auch Befehlsausgaben im Terminal nach bestimmten Schlagworten filtern.
- Syntax: grep [Option(en)] Suchstring [Datei(en)]
Shell-Paramter in eckigen Klammern sind optional und können auch weggelassen werden. Man nutzt sie um das Suchverhalten anzupassen und/oder die Suche auf bestimmte Dateien/Verzeichnisse einzugrenzen.
Dateien mit grep nach bestimmten Textinhalt durchsuchen
grep "Pilze" *.txt
Der Befehl listet im aktuellen Verzeichnis alle Zeilen aller TXT-Dateien auf, die den Textinhalt „Pilze“ enthalten. Gefundene Zeilen werden inklusive des zugehörigen Dateinamens ausgegeben.
- Unterordner werden NICHT einbezogen. Hierfür sieht der Befehl so aus:
find -name "*.txt" -exec grep -H "Pilze" '{}' \; -print
- Es wird zwischen Groß- und Kleinschreibung unterschieden. Der Befehl
grep -i "Pilze" *.txt
unterscheidet das nicht.
In unserem Beispiel findet grep im aktuellen Verzeichnis nur die Datei „Einkaufsliste.txt“, die in einer Zeile den Text „Pilze“ enthält:
Alternativ könnt ihr auch nur bestimmte Dateien nach einem Textinhalt durchsuchen:
grep "Pilze" Einkaufsliste.txt MeinBuch.txt Wünsche.txt
Dieser Befehl durchsucht die drei Textdateien „Einkaufsliste.txt“, „MeinBuch.txt“ und „Wünsche.txt“ nach dem Textinhalt „Pilze“. Statt der konkreten Dateinamen könnt ihr auch ein bestimmtes Verzeichnis angeben, das durchsucht wird:
grep "Pilze" /home/Petra/Testordner
Dateien mit grep durchsuchen, die den Textinhalt NICHT enthalten
grep -v 'Pilze' *.txt
Der Befehl listet alle Zeilen aller TXT-Dateien im aktuellen Verzeichnis auf, die den Textinhalt „Pilze“ NICHT enthalten. In unserem Beispiel findet der grep-Befehl drei Dateien („Der Engel.txt“, „Einkaufsliste.txt“ und „Wer bin ich.txt“). Und listet alle Zeilen innerhalb dieser drei Dateien auf, die den Text „Pilze“ nicht enthalten – Leerzeilen inbegriffen.
Mit grep nur die Trefferanzahl anzeigen lassen
grep -c "Pilze" *.txt
Der Befehl durchsucht alle TXT-Dateien im aktuellen Verzeichnis nach dem Text „Pilze“ und listet die Anzahl der Treffer pro gefundener TXT-Datei auf. In unserem Beispiel findet grep drei TXT-Dateien, aber den Text „Pilze“ nur einmal in der Datei „Einkaufsliste.txt“:
Zeilennummer der gefundenen Textstelle mit ausgeben
grep -n "Pilze" *.txt
Besonders für Programmierer ist die Option -n sinnvoll: Der Befehl gibt zusätzlich die Zeilennummer an, wo der gesuchte Textinhalt in welcher Datei gefunden wurde. In unserem Beispiel kommt der Text „Pilze“ in der Datei „Einkaufsliste.txt“ in der 2. Zeile vor:
Mit grep nur ganze Wörter finden wie „ein“, aber nicht „Stein“
grep -w "ein" *.txt
Der Befehl sucht nach Zeilen in TXT-Dateien, die nur das ganze Wort „ein“ enthalten. Wörter wie „Stein“ oder „kein“ werden also ausgeschlossen. Bedenkt, dass auch zwischen Groß- und Kleinschreibung unterschieden wird. Wer das nicht möchte, fügt noch die Option -i mit in den befehl ein. In unserem Beispiel wird „ein“ nur in der Datei „Der Engel.txt“ gefunden. Das Wort „Stein“ in der Datei „Einkaufsliste.txt“ wird nicht hervorgehoben:
Terminal-Befehlsausgaben mit grep filtern
Angenommen ihr möchtet den Prozess „audacity“ beenden, weil er Linux verlangsamt. Das funktioniert zuverlässig mit dem Befehl „kill -9“ im Terminal. Allerdings benötigt der Befehl die zugehörige PID (Prozess-ID), um ihn zu beenden. Der Befehl „ps -e“ listet alle laufenden Prozesse auf. Die Liste ist aber oft zu lang. Wenn ihr schnell die zugehörige PID haben möchtet, kombiniert ihr den Befehl mit grep wie folgt:
ps -e | grep audacity
Das Terminal zeigt euch nun nur die Prozess-ID(s) an, in denen „audacity“ vorkommt.