Linux - grep

Aus Wikizone
Wechseln zu: Navigation, Suche

Tutorial[Bearbeiten]

https://kushellig.de/linux-unix-grep-befehl-beispiele/

grep Linux Tutorial mit Beispielen[Bearbeiten]

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 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:[Bearbeiten]

   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[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

Willst du auch in den Unterverzeichnissen Dateien durchsuchen, musst du die Option -r mitangeben.

NICHT betroffene Zeilen anzeigen[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

Trefferanzahl anzeigen[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

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

Such-Pattern aus Datei laden[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

grep bietet viele Optionen wie z.B. Regexes, mit denen es erst so richtig mächtig wird.