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

Mandriva gibt Distribution in die Hände der Community
(268 Punkte bei 24 Stimmen)
Neues vom Systemd
(161 Punkte bei 4 Stimmen)
Mandriva in Nöten
(161 Punkte bei 4 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Shopping
Topsuche
 
Yatego Deutschlands größte Shoppingmall. 10000 Shops,
3.5 Mio Artikel. Alle Bestseller, Servertechnik und Technik Themenwelten.

Notebooks und Netzwerkhardware bei Mercateo günstig kaufen.
Internet Telefonie mit VoIP Telefonen von Gigaset
Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.
Günstige Digitalkameras finden Sie im Preisvergleich.
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.

Einem Freund empfehlen    Druckansicht Bookmark and Share
Kommentare

1608 Hits
Wertung: 0 Punkte (1 Stimme)

Schlecht Gut

Infos zur Publikation

Infos zur Publikation

LinuxUser 06/2012

Aktuelle Ausgabe kaufen:

Heft bestellen Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,50 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 56,10) können Sie im LNM-Shop bestellen.

Tipp der Woche

Adobe AIR
Adobe-AIR-Programme installieren und (manuell) starten
Tim Schürmann, 14.05.2012 13:09, 0 Kommentare

Es gibt sie noch: neue Anwendungen, die Adobes Integrated Runtime voraussetzen. Aktuellstes und vermutlich auch größtes Beispiel ist das Adventure Botanicula

Aktuelle Fragen

gibt es ein Kommandozeilen Tool, um ein X11-Fenster in ein Anderes einzubetten?
GoaSkin , 21.05.2012 16:44, 0 Antworten
Das XEmbed-Protokoll ist u.A. dazu gedacht, dass man eine X11-Anwendung in eine andere wie ein Wi...
Apache2, Options -Indexes geht nicht
no no, 12.05.2012 19:01, 8 Antworten
Habe in apache2.conf folgendes stehen: Options -Indexes ...
LInux auf Dell LS H500
Andreas Endresl, 09.05.2012 08:54, 2 Antworten
Habe einen alten Dell Latitude LS H500 nur mit ext. Floppy und CD es geht nur immer eines von den...
Datenwiederherstellung unter Ubuntu 12.04 mit "Simple Backup" nach Umzug von Linux Mint
Christian Lottmann, 07.05.2012 13:33, 0 Antworten
Vor dem Umzug auf Ubuntu 12.04 habe ich unter Linux MInt mit "Simple Backup" voll (15.4.2012) und...
DKMS für den propritären NVIDIA-Treiber
Commander Data, 26.04.2012 22:02, 2 Antworten
Hallo an die Gemeinde. Ich habe hier ein interessantes Stück openSuSE gefunden. http://forums.op...