Den grep-Befehl kennen viele Linux- und Unixuser bereits, allerdings oft nur oberflächlich. Für mehr als einfaches Stringsuchen nutzen es die meisten nicht. Wenn für dich grep nicht mehr als grep “hallo” datei bedeutet oder du grep noch gar nicht kennst, solltest du dir dieses Tutorial durchlesen 🙂
grep
grep ist ein Unix Befehl, mit dem du Zeilen aus Code- und Log-Dateien oder Commandoutputs nach Strings durchsuchen kannst. Zum Beispiel: zeige mir alle Zeilen aus Datei xyz.txt, die das Wort “hallo” enthalten.
grep "hallo" xyz.txt
grep steht für global regular expression print. Das heisst, dass du auch Regular Expressions für die Suche nutzen kannst. Wenn du noch nicht weisst, was Regular Expressions sind, solltest du dir ein Regex-Tutorial anschauen. Empfehlenswert ist zum Beispiel das interaktive von regexone.com. Ohne Regexes ist grep aber natürlich auch nutzbar.
egrep oder grep -E?
egrep ist wie grep, nur mit dem Unterschied, dass du auch +, ?, | und () als Regular Expression nutzen kannst. egrep ist nichts anderes als ein grep -E
. Auf vielen Maschinen ist egrep sogar nur ein Link auf grep. Ausserdem ist egrep deprecated, weswegen du lieber zum grep -E
greifen solltest.
grep Optionen:
- Schreibweisen (kurz & lang)
- grep Regex Syntax
- grep rekursiv/Unterordner
- NICHT betroffene Zeilen anzeigen
- Groß- und Kleinschreibung ignorieren
- Nur ganze Wörter finden
grep Output anpassen
- Trefferanzahl anzeigen
- Zeilennummer für jeden Treffer
- Nur Dateinamen anstatt betroffene Zeilen anzeigen
- Nur NICHT betroffene Dateinamen anzeigen
- Treffer einfärben (auch per default)
- Suchstring aus Datei laden
Testdatei
Alle Beispiel-Outputs beziehen sich auf folgende Datei datei.txt:
hallo du
Hallo du
halo süchtig
halodrian
Die Datei kannst du einfach per
echo "hallo du\nHallo du\nhalo süchtig\nhalodrian" > datei.txt
erstellen.
grep Befehl: Syntax
Die Grundsyntax eines grep-Aufrufs in der Shell ist folgende:
grep [Optionen] Suchstring [Datei(en)]
Anmerkung: Shell Parameter in [ ] wie [Optionen] sind optional, das heisst, dass du sie nach Belieben auch weglassen kannst.
grep Optionen
Mittels verschiedener Optionen kannst du das Verhalten und die Ausgabe von grep verändern.
Schreibweisen
Dabei gibt es zwei Varianten, die Optionen anzugeben. Diese Varianten gibt es bei den meisten Linux-Befehlen:
die Kurzform, ein Minuszeichen und direkt dahinter der Optionsbuchstabe. Bsp:
-c
Vorteile: kürzer, und bei dieser Form kannst du auch gleich mehrere Optionen hintereinander klemmen, z.B.
-ciw
die Langform, zwei Minuszeichen und der Optionsname ausgeschrieben. Bsp:
–count
grep Regex Syntax
Willst du +, ?, | und () im Suchmuster nutzen, musst du den Parameter -E anhängen.
grep -E 'hall?o' datei.txt
sucht nach “halo” und “hallo” in der datei.txt.
Output:
hallo du
halo süchtig
halodrian
grep rekursiv: Unterverzeichnisse durchsuchen
Willst du auch in den Unterverzeichnissen Dateien durchsuchen, musst du die Option -r
mitangeben.
NICHT betroffene Zeilen anzeigen
Willst du nur Zeilen sehen, die den Suchstring NICHT enthalten, hilft dir die Option -v
.
Beispiel:
grep -v 'hallo' datei.txt
Output:
Hallo du
halo süchtig
halodrian
Groß- und Kleinschreibung ignorieren
Standardmässig sucht der grep-Befehl case-sensitive. Das heisst, die Groß- und Kleinschreibung wird beachtet. Willst du ohne dies, also case-insensitive, suchen, musst du die Option -i
hinzufügen.
Beispiel:
grep -i 'hallo' datei.txt
Output:
hallo du
Hallo du
Nur ganze Wörter finden
Per default findet grep alle Vorkommen des Suchstrings, sowohl in Wortteilen als auch in ganzen Wörtern. Nur auf Vorkommen in ganzen Wörtern beschränkst du per -w
.
Beispiel:
grep -w 'halo' datei.txt
Output:
halo süchtig
Ausgabe von grep anpassen
Trefferanzahl anzeigen
Die Anzahl aller Zeilen, die das Suchmuster beinhalten, kannst du dir mit -c
oder –count
ausgeben lassen. Damit liefert grep die reine Anzahl, also z.B. “4” für 4 Treffer zurück, sonst nichts.
Beispiel:
grep -c 'hal' datei.txt
Output:
3
Zeilennummer für jedes Match
Sinnvoll vor allem bei Sourcecode-Dateien ist die Option -n
. Wenn du dem grep-Befehl diese Option übergibst, wird vor jedes Match die Zeilennummer des Matches geschrieben.
Beispiel:
grep -n 'halo' datei.txt
Output:
1:hallo du
3:halo süchtig
4:halodrian
Nur Dateinamen ausgeben lassen
Manchmal braucht man nur den/die Dateinamen, in denen der Suchstring gefunden wurde. Das kannst du über die Option -l
(kleines “L”)erreichen.
Beispiel:
grep -l 'hal' \*.txt
Output:
datei.txt
Zeige gefundene, NICHT matchende Dateinamen
Auch gibt es Anwendungsfälle, in denen du nur die Dateinamen aufgelistet haben willst, in denen der Suchstring NICHT gefunden wurde. Dafür nutzt du die Option -L
.
Beispiel:
grep -R -L 'huhu' <pfad>
Output:
datei.txt
Treffer einfärben
Standardmässig ist die Ausgabe von grep farblos. Für die Übersichtlichkeit ist es hilfreich, wenn du das gematchte Pattern in jeder Zeile farblich hervorhebst.
Ich habe das per Default in meiner ~/.bashrc
bzw. ~/.zshrc
. Wenn du dies auch willst, musst du nur die Zeile
export GREP_OPTIONS='--color=auto'
in deiner Shell-Config-File einfügen. Falls dir die Farbe nicht gefällt, kannst du sie per
export GREP_COLOR='1;32'
nach Belieben ändern. Für eine andere Farbe einfach einen der Farbcodes in den Hochkommata ersetzen.
Farbcodes:
Black 0;30 Dark Gray 1;30
Blue 0;34 Light Blue 1;34
Green 0;32 Light Green 1;32
Cyan 0;36 Light Cyan 1;36
Red 0;31 Light Red 1;31
Purple 0;35 Light Purple 1;35
Brown 0;33 Yellow 1;33
Light Gray 0;37 White 1;37
Pattern aus Datei laden
Wenn du komplexere Such-Patterns bzw. Regexes immer wieder verwenden willst, kannst du diese in Dateien speichern und im grep-Befehl per -f <regexdatei>
einbinden.
Beispiel: alle Zeilen mit Emailadressen aus einer Datei filtern
grep -E '([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})' datei.txt
Den Regex ohne die einfachen Anführungsstriche in eine Datei schreiben:
echo '([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})' > ~/snippets/regexes/email
Nun kannst du den Regex im obigen Beispiel mit dem File ersetzen:
grep -Ef ~/snippets/regexes/email datei.txt
Tipp: Mach es dir zur Gewohnheit, immer alle Regexes, die du verwendest, unter einem aussagekräftigen Dateinamen in einem bestimmten Verzeichnis zu speichern. So sammelst du mit der Zeit ein komfortables, wiederverwendbares Regex-Kompendium.
Beispiele
Hier mal ein paar Praxisbeispiele für den Einsatz von grep:
Grafikkarte ausgeben
lspci | grep VGA
Regex: Zeilen mit “foobar” am Anfang finden (in datei1.txt UND datei2.txt)
grep '^foobar' datei1.txt datei2.txt
Regex: finde Leerzeilen
grep '^$' file.php
finde Zeilen mit “ein”, aber nur als ganzes Wort -> nicht “Bein” oder “einziehen”
grep -w 'ein' datei.txt
Regex: Zeige alle HDDs an
dmesg | grep -E '(s|h)d[a-z]'
Liste alle mysql Prozesse auf
ps aux | grep mysql
Fazit
grep bietet viele Optionen wie z.B. Regexes, mit denen es erst so richtig mächtig wird.
Ist noch etwas unklar? Fehlt dir etwas in diesem Artikel? Hilf mir, ihn zu verbessern, und hinterlasse unten bitte ein Kommentar oder bewerte ihn!