Home / LinuxUser / 2004 / 05 / Zu Befehl: Suchen mit grep, egrep, fgrep, (b)zgrep

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

Eingedost
(161 Punkte bei 4 Stimmen)
Aufteiler
(161 Punkte bei 4 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.

88042_8721.jpg

© Jim Ernsberger

Stecknadel im Heuhaufen

Zu Befehl: Suchen mit grep, egrep, fgrep, (b)zgrep

01.05.2004 Für die Suche nach Wörtern und Ausdrücken in Textdateien bieten sich die Kommandos der grep-Familie an. Als Ergebnis zeigen sie wahlweise die gefundenen Zeilen, die Namen der Dateien, in denen das Suchmuster vorkommt, oder die Anzahl der Treffer an.

Zu Befehl

Auch wenn sich viele Dinge bequem über grafische Oberflächen wie KDE oder GNOME regeln lassen – wer sein Linux-System richtig ausreizen möchte, kommt um die Kommandozeile nicht herum. Abgesehen davon gibt es auch sonst viele Situationen, in denen es gut ist, sich im Befehlszeilendschungel ein wenig auszukennen.

Vergessen, welche Datei die nützlichen Hinweise zu Programm xy enthielt, die sie vor geraumer Zeit einmal notierten? Dann helfen die Kommandos der grep-Familie weiter. Der Befehl grep (kurz für "global regular expression print/parser") durchsucht Textdateien nach Suchmustern und gibt als Ergebnis die Zeilen am Bildschirm aus, die einen Treffer enthalten.

Als Suchmuster versteht das Kommando nicht nur einfache Textausschnitte, sondern auch reguläre Ausdrücke, mit denen sich die legendäre Stecknadel im Heuhaufen finden lässt.

Im einfachsten Fall durchforstet grep die angegebene(n) Datei(en) (im folgenden Beispiel grep.html) nach einem einfachen Wort und und gibt die Zeilen auf dem Bildschirm aus, die es enthalten:

huhn@asteroid:~$ grep Der grep.html
Der Befehl grep (global regular expression …
suchmuster datei(en). Der Befehl durchfors …

Standardmäßig unterscheidet der Befehl bei den Suchbegriffen zwischen Groß- und Kleinschreibung. Abschalten lässt sich dieses Verhalten mit dem Parameter -i. Da grep jetzt allerdings auch Wörter findet, die "der" als Teilwort enthalten, z. B. "oder", fordern Sie einfach zusätzlich mit -w, dass das Kommando nur nach ganzen Wörtern sucht:

huhn@asteroid:~$ grep -iw der grep.htmlDer Befehl grep (global regular expression …
suchmuster datei(en). Der Befehl durchfors …
auch die Zeilen sehen möchte, in denen "der" …

Ein bisschen mehr erfahren Sie, wenn Sie den Parameter -n verwenden – dann zeigt grep auch die Zeilennummer an:

huhn@asteroid:~$ grep -n "Das" grep.html
109:Das ^-Zeichen markiert den Zeilenanfang – …
112:Sonderzeichen nicht interpretiert. Das Zeil…

Bei der Suche nach Einzelwörtern sind die Gänsefüsschen freiwillig; sie müssen dastehen, wenn das Suchmuster z. B. Leerzeichen enthält.

Um die gefundenen Zeilen besser ins Gesamtbild einzuordnen, bietet grep die Option -num, wobei num die Anzahl der Zeilen ist, die Sie zusätzlich vor und nach der Trefferzeile sehen möchten. grep -10 "Das" grep.html fängt mit der Ausgabe zehn Zeilen vor der Fundstelle an und endet zehn Zeilen danach.

Zu viele Informationen auf einmal? Lassen Sie sich mit grep -c einfach nur die Anzahl der gefundenen Zeilen nennen. Wer lediglich wissen möchte, wie die Datei heißt, die das Suchmuster enthält, erfährt dies mit dem Parameter -l:

huhn@asteroid:~$ grep -l Befehl *.html
grep.html
zubefehl.html

Das Beispiel durchsucht alle auf .html endenden Dateien im aktuellen Verzeichnis. Wollen Sie ganze Verzeichnishierarchien durchforsten, nutzen Sie den zusätzlichen Parameter -r (für rekursiv):

huhn@asteroid:~/linux-user$ grep -r Kommandozeile *
01_2004/zubefehl/df_du.html:behalten. Wir zeigen, wie Sie auf der Kommandozeile
01_2004/zubefehl/df_du.html:Dateisystem etwas "überläuft". Linux bietet
11_2003/MagicPoint/magicpoint.html:MagicPoint einige Kommandozeilenoptionen
[…]

Manchmal ist es sinnvoll, einzelne Ergebnisse aus der Suchliste wieder zu streichen, z. B., wenn man Log-Dateien durchforstet und bestimmte Informationen einfach ausblenden möchte. Dazu eignet sich die Option -v, die grep anweist: "Suche nach allen Zeilen, die das Suchmuster nicht enthalten!". Die mit

huhn@asteroid:~$ grep huhn /var/log/auth.log | grep -v pam
Mar 18 12:53:21 asteroid sshd[1965]: Accepted password for huhn from 192.168.2.15 port 1034 ssh2
Mar 18 12:57:06 asteroid sshd[2025]: Accepted password for huhn from 192.168.2.15 port 1035 ssh2
Mar 18 13:00:13 asteroid sudo:     huhn : TTY=pts/0 ; PWD=/home/huhn ; USER=root ; COMMAND=/bin/bash

durchsuchte Datei /var/log/auth.log protokolliert alle Einträge, die mit Authentifizierung zu tun haben. Viele Programme, z. B. login und sshd, benutzen PAM (Pluggable Authentication Modules), um den Benutzer zu authentifizieren (mehr dazu in /etc/pam.d). Im Beispiel sucht grep nach allen Zeilen, die den Namen des Users huhn enthalten, und wirft anschließend aus den Ergebnissen mit grep -v pam alle pam-Einträge wieder raus.

Tabelle 1: Reguläre Ausdrücke

Suchmuster Bedeutung
abc Genau diese Zeichenkette: "abc"
[abc] Eines dieser Zeichen: "a", "b" oder "c"
[^abc] Keines der Zeichen darf auftauchen
[a-c] Eines der Zeichen von "a" bis "c"
. Ein beliebiges Zeichen
? Das Zeichen vor dem "?" darf einmal oder gar nicht auftreten (nur egrep)
* Das Zeichen davor darf beliebig oft oder gar nicht auftreten
+ Das Zeichen davor darf beliebig oft, muss aber mindestens einmal auftreten (nur egrep)
| Verknüpfung zweier Suchmuster, nach denen alternativ gesucht wird (nur egrep)
{n} Das Zeichen zuvor muss genau n-mal auftreten
{,n} Das vorangehende Zeichen darf höchstens n-mal auftreten
{n,} Das vorangestellte Zeichen muss mindestens n-mal auftreten
{n,m} Das Zeichen zuvor muss mindestens n-mal und höchstens m-mal auftreten

Noch genauer bitte!

Wer genau weiß, dass der gesuchte Text irgendwo am Zeilenanfang einer Datei versteckt ist, gibt das als regulären Ausdruck bei der Suche mit an:

huhn@asteroid:~$ grep "^Der" grep.html
Der Befehl grep (get regular expression…

Das ^-Zeichen markiert den Zeilenanfang – beachten Sie, dass entweder ein Backslash (\) vor dem Meta-Zeichen stehen oder das gesamte Suchmuster in doppelte Anführungszeichen eingeschlossen werden muss, damit die Shell das Sonderzeichen nicht als für sich gedacht vorab interpretiert. Nach dem Zeilenende suchen Sie mit dem Dollarzeichen:

huhn@asteroid:~$ grep "und$" grep.html
expression) durchsucht Textdateien nach Suchmustern und
grep arbeitet "case sensitive", d. h. unterscheidet Groß-

Die beiden Zeichen ^ und $ lassen sich auch kombinieren: Setzen Sie einfach einen beliebigen Text dazwischen, sucht grep nach genau dieser Zeile. Wer statt ganzen Zeilen lieber einzelne Begriffe definiert, begrenzt Wörter mit \< und \>.

Andere reguläre Ausdrücke funktionierne nur zusammen mit egrep bzw. grep -E (Tabelle 1). egrep steht für "extended grep" ("erweitertes grep"). Sucht man beispielsweise in einem Text nach den Wörtern "Petronella" und "Petrosilie", geht das mit egrep ganz einfach so:

egrep "Petro(nella|silie)" datei.txt

Etwas Vorsicht vor der Interpretationslust der Shell ist bei den Ausdrücken in geschweiften Klammern aus Tabelle 1 geboten: Einfach nur in Gänsefüßchen setzen, hilft hier nicht; um alle Zeilen mit drei "m"s hintereinander zu finden, muss man

grep "m\{3\}" datei

schreiben.

Andere Familienmitglieder

Zur grep-Familie gehören noch weitere Kommandos. Der Befehl fgrep (alternativ grep -F) verwendet einen schnelleren Suchalgorithmus, erlaubt aber keine regulären Ausdrücke als Suchmuster. Das Kommando empfiehlt sich immer dann, wenn besonders schnell große Datenmengen durchsucht werden sollen.

Geht es hingegen um komprimierte Dateien, helfen zgrep und bzgrep weiter: Mit gzip gepackte Dateien durchsuchen Sie mit zgrep, mit bzip2 Komprimiertes entsprechend mit bzgrep:

bzgrep Petronella datei.txt.bz2

Das erspart umständliches Entpacken und Neukomprimieren vor und nach der Suche.

Glossar

reguläre Ausdrücke

Eine Möglichkeit, Suchanfragen mit Spielraum der Art "alle Zeilen, die mit A oder B beginnen und auf g enden" zu formulieren. Als "Regular Expression", kurz: Regexp, sieht diese Beispiel so aus: "^AB,*g$"; die darin verwendeten Zeichen erklärt Tabelle 1. Weitere Informationen geben [1] und http://de.wikipedia.org/wiki/Reguläre_Ausdrücke.

Infos

[1] Reguläre Ausdrücke: Marc André Selig, "Nadel im Heuhaufen", LinuxUser 08/2002, S. 74 ff.

Tip a friend    Druckansicht Bookmark and Share
Kommentare

4043 Hits
Wertung: 0 Punkte (1 Stimme)

Schlecht Gut

Infos zur Publikation

Infos zur Publikation

LinuxUser 05/2014

Aktuelle Ausgabe kaufen:

Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,95 und mit DVD EUR 8,50. Weitere Informationen zum Heft finden Sie auf der LinuxUser-Homepage.

Im LinuxUser-Probeabo erhalten Sie drei Ausgaben für 3 Euro. Das Jahresabo (ab EUR 60,60) können Sie im Medialinx-Shop bestellen.

Tipp der Woche

Bilder vergleichen mit diffimg
Bilder vergleichen mit diffimg
Tim Schürmann, 01.04.2014 12:40, 1 Kommentare

Das kleine Werkzeug diffimg kann zwei (scheinbar) identische Bilder miteinander vergleichen und die Unterschiede optisch hervorheben. Damit lassen sich nicht nur Rätsel a la „Orignial und Fäls...

Aktuelle Fragen

programm suche
Hans-Joachim Köpke, 13.04.2014 10:43, 8 Antworten
suche noch programme die zu windows gibt, die auch unter linux laufen bzw sich ähneln sozusagen a...
Funknetz (Web-Stick)
Hans-Joachim Köpke, 04.04.2014 07:31, 2 Antworten
Bei Windows7 brauche ich den Stick nur ins USB-Fach schieben dann erkennt Windows7 Automatisch, a...
Ubuntu 13.10 überschreibt immer Windows 8 Bootmanager
Thomas Weiss, 15.03.2014 19:20, 8 Antworten
Hallo Leute, ich hoffe das ich richtig bin. Ich habe einen Dell Insipron 660 Ich möchte gerne Ub...
USB-PTP-Class Kamera wird nicht erkannt (Windows-only)
Wimpy *, 14.03.2014 13:04, 15 Antworten
ich habe meiner Frau eine Digitalkamera, AGFA Optima 103, gekauft und wir sind sehr zufrieden dam...
Treiber
Michael Kristahn, 12.03.2014 08:28, 5 Antworten
Habe mir ein Scanner gebraucht gekauft von Canon CanoScan LiDE 70 kein Treiber wie bekomme ich de...