grep ist ein Programm, dass einen der häufigsten Anwendungsfälle in der bash abdeckt. Der ist das Suchen in Dateien.
grep
Die Funktionsweise von grep
ist simpel: zu einem String filtert es alle Zeilen aus, die diesen String enthalten.
grep ist üblicherweise automatisch in Raspberry Pi OS installiert und du musst nichts zusätzlich installieren.
Beispieldateien
Für diesen Post benötige ich einige Dateien, die wir in grep füttern können. Dazu habe ich Figuren aus „Die Simpsons“ ihrem sozialen Umfeld zugeordnet.
familie.txt
Simpson, Marge
Simpson, Homer
simpson, Abe
Simpson, Bart
Simpson, Lisa
Simpson, Maggie
Powell, Herb
schule.txt
--- Lehrer -----
Skinner, Seymour
Krababel, Edna
Hoover, Elisabeth
Largo, Dewey
--- Schüler ----
2: Powell, Janey
2: Wiggum, Ralph
2: Simpson, Lisa
2: Shorter, Becky
2: Taylor, Alison
4: Kyle
4: Clark, Lewis
4: van Houten, Milhouse
4: Simpson, Bart
4: Muntz, Nelson
4: Borton, Wendell
4: Prince, Martin
6: Starbeam, Dolph
6: Jones, Jimbo
6: Zzyswincz, Kearney
?: Zörker, Uter
snpp.txt
Burns, Monty
Smithers, Waylon
Carlson, Carl
Leonard, Lenny
Simpson, Homer
Diese Dateien kannst du dir auch vom git-Repository runterladen.
Dein Arbeitsverzeichnis sollte jetzt so aussehen

Wir suchen in familie.txt nach dem Wort „Simpson“.
grep Simpson familie.txt

grep gibt jetzt alle Zeilen aus, in denen das Wort Simpson vorkommt. Lediglich die letzte Zeile der Datei bleibt dadurch außen vor.
Suche invertieren
Es kommt nicht selten vor, dass du nur die Zeilen sehen willst, in denen ein bestimmtes Wort nicht vorkommt. Dazu dient der Parameter -v
. Beim Start des Raspberry Pi schreiben viele Prozesse in das Logfile /var/log/syslog, unter anderem auch der systemd.
Um jetzt herauszufinden, welcher Prozess außer dem śystemd Einträge geschrieben hat, gehst du so vor:
sudo grep -v systemd /var/log/syslog
Zeilennummern
Manchmal ist es wichtig, die Nummer der Zeile zu wissen, in der der Suchstring auftaucht. Dazu bietet grep
den Parameter -n
an.
grep -n Simpson *.txt

An diesem Beispiel siehst du auch, dass grep auch über mehrere Dateien suchen kann. in diesem Beispiel alle Dateien, die die Endung *.txt
tragen.
Groß-/Kleinschreibung
In Logfiles suche ich häufig nach Zeilen, die einen Fehler enthalten. Leider schreiben manche Programme dann ERROR, andere Erfror oder error. Da ist es sinnvoll, die Groß-/Kleinschreibung bei der Suche zu ignorieren. In familie.txt hat sich ein Tippfehler eingeschlichen, wodurch Grandma Simpson oben nicht ausgegeben wurde. Also versuchen wir es jetzt nochmal mit
grep -i Simpson familie.txt
Jetzt wird auch Abe gefunden, obwohl der Nachname mit einem kleinen ’s‘ beginnt.

Vorkommnisse zählen
Gerade in einem Script ist es meistens interessanter, wie oft das Suchwort gefunden wurde. Dafür bietet uns grep
den Parameter -c
an.
grep -ci Simpson *.txt
Du siehst hier, du kannst mehrere Parameter auch kombinieren, so dass auch hier die Groß-/Kleinschreibung ignoriert wird.

Zu jeder Datei wird jetzt nur noch ausgegeben, wie oft der Suchstring in der Datei gefunden wurde. Wie du diesen Wert in einem Script auswerten kannst, zeige ich dir in einem späteren Post.
rekursiv Suchen
Bislang haben wir nur die Dateien in einem Verzeichnis durchsucht. Das reicht aber in Verzeichnisstrukturen nicht immer aus.
Ich wechsle jetzt mal in die Hauptebene des bash Tutorial Repository und suche in allen Verzeichnissen in alle Dateien nach „for“
grep -rc for *
Da für jede Datei gezählt wird, ist die Liste sehr umfangreich.

Ergebnis weiterreichen
Da uns nur die Dateien interessieren, in den „for“ wirklich vorkommen, reichen wir das Ergebnis in ein zweites grep Kommando hinein.
Dies lässt nur noch die Zeilen durch, in denen keine „0“ steht.
grep -rc for * |grep -v 0

Jetzt haben wir nur noch die Dateien, in den wirklich „for“ vorkommt. Sorry für das schlechte Wortspiel 😉
Dieses mehrfache Filtern mache ich in der Praxis sehr häufig, gerade in der Kombination grep -r|grep -v
Umgekehrt kannst auch die Ausgabe eines anderen Kommandos in grep hinein pipen. Beispielsweise, wenn du in der Hilfeseite von ls nach „sortieren“ suchst
ls --help |grep sortieren
Auf diese Weise kannst du dir alle Parameter anzeigen lassen, die die Sortierung beeinflussen.

Fazit
grep macht dir das Leben sehr einfach. Die wichtigsten Anwendungsfälle habe ich dir hier aufgezeigt und mit der Praxis wirst du grep nicht mehr missen wollen.