grep – bash Tutorial Teil 17

grep ist ein Programm, dass einen der häufigsten Anwendungsfälle in der bash abdeckt. Der ist das Suchen in Dateien.

1Einführung
2Der bash Prompt
3key bindings
4Der Startvorgang
5Environment Variablen
6builtin commands
7Arbeiten mit Dateien
8nano
9bash Scripting
10Variablen
11Verzweigungen (if)
12Schleifen
13Kommandozeilenparameter
14exit Codes bash Tutorial Teil 14
15von der Idee zum Script
16grep
17Piping und Redirection
18tee
19alias
20Der Shebang
21Das sed Kommando

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

Olli Graf - raspithek.de
filesCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=

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

grep Simpson familie.txt

Olli Graf - raspithek.de
grep-simpson-familieCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=

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
Olli Graf - raspithek.de
grep-nCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=

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.

Olli Graf - raspithek.de
grep-iCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=

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.

Olli Graf - raspithek.de
grep-ciCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=

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.

Olli Graf - raspithek.de
grep-r-forCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=

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
Olli Graf - raspithek.de
grep-r-for-pipedCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=

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.

Olli Graf - raspithek.de
ls–help-grepCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=

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.

Schreibe einen Kommentar

Insert math as
Block
Inline
Additional settings
Formula color
Text color
#333333
Type math using LaTeX
Preview
\({}\)
Nothing to preview
Insert
Creative Commons License
Except where otherwise noted, the content on this site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Olli Graf - raspithek.de
WordPress Cookie Hinweis von Real Cookie Banner