January 12, 2013

grep Linux Tutorial mit Beispielen

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:

  1. Schreibweisen (kurz & lang)
  2. grep Regex Syntax
  3. grep rekursiv/Unterordner
  4. NICHT betroffene Zeilen anzeigen
  5. Groß- und Kleinschreibung ignorieren
  6. Nur ganze Wörter finden

grep Output anpassen

  1. Trefferanzahl anzeigen
  2. Zeilennummer für jeden Treffer
  3. Nur Dateinamen anstatt betroffene Zeilen anzeigen
  4. Nur NICHT betroffene Dateinamen anzeigen
  5. Treffer einfärben (auch per default)
  6. 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:

  1. 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

  2. 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

Quelle

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!