|
Grep wird in erster Linie dann eingesetzt, wenn Dateien durchsucht
werden müssen, zum Beispiel die Quelldateien eines Computerprogramms
oder Logdateien.
Grep arbeitet bei der Suche wesentlich effizienter als das in einem
Editor geschehen würde. Per Voreinstellung schreibt das Kommando alle
Zeilen der Eingabe, die das gesuchte Muster enthalten, auf die
Standardausgabe.
In Zusammenarbeit mit "find" kann ein ganzer
Dateibaum nach einem Textmuster durchsuchen:
$ find /home/user -exec grep -H "Passwort" {} \;
Dieses Kommando durchsucht alle Dateien des Homelaufwerkes des Benutzers
"user" nach der Zeichenkette "Passwort" und zeigt die gefundenen Zeilen
zusammen
mit dem Dateinamen an, wobei die Anzeige des Dateinamens durch die
Option -H ausgelöst wird.
In welchen Zeilen einer Datei kommen bestimmte
Wörter vor?
Beispiel:
In welchen Zeilen der Datei passwd der String "home" vorkommt:
simon@etch:/etc$ grep home passwd
simon:x:1000:1000:Simon Bienlein,,,:/home/simon:/bin/bash
ftp:x:105:65534::/home/ftp:/bin/false
In welcher Datei kommt ein bestimmtes Texmuster
vor?
Nun soll der Text ÃÂItalienÃÂ unabhängig von dessen Groß- und
Kleinschreibung im aktuellen Laufwerk gesucht, und eine Liste der
gefundenen Dateien ausgegeben werden:
simon@etch:~$ grep -li "Italien" *
blindtext.txt
cookie.php
Gesucht wird (wort1 ODER wort2):
grep -i -l -E "(wort1|wort2)" *.doc
Recursive im ganzen Verzeichnisbaum suchen:
grep -li --recursive "Fileserver" /
-l gibt die gefundenen Dateien aus
-L gibt die Dateien aus die das Muster nicht enthalten
Beschreibung von Textmustern mit "und" und
"oder":
Suchen mit der "und" Vorgabe:
Beispiel: (wort1 UND wort2) werden in allen .doc Dateien gesucht.
grep -E 'wort1.*wort2|wort2.*wort1' *.doc
Suchen mit der "oder" Vorgabe:
Beispiel: (wort1 ODER wort2) werden in allen *.doc Dateien gesucht.
grep -E 'wort1|wort2' *.doc
Anwendung des Kommandos zur
Zeilenumbruchentfernung
Das in "datei.txt" zu Suchende Beispielmuster sei "(wort1 UND wort2)"
Versagt aufgrund eines Zeilenumbruchs die Suche mit diesem Befehl:
grep -E 'wort1.*wort2|wort2.*wort1' datei.txt
könnte dieser Suchbefehl zu Ergebnissen führen:
cat datei.txt | tr -d \\012 | grep -E 'wort1.*wort2|wort2.*wort1'
"cat" gibt den Inhalt einer Datei zeilenweise auf der Konsole aus, das
ist bei großen Dateien unbefriedigend.
Daher gibt es "more" und "less". "more" und "less" zeigen
Dateiinhalte seitenweise an - eine sinnvolle Ergänzung zu 'cat'.
Funktion:
cat dateiname
zeigt die Datei an
cat dateiname | more zeigt die Datei seitenweise an und
erlaubt Blättern vorwärts mit den Tasten Return und Space, beenden mit
'q'
less dateiname
zeigt zeigt die Datei seitenweise an und erlaubt Blättern in beide
Richtungen mit BILD, beenden mit 'q'
Alle Dateien in einem Verzeichnisbaum durchsuchen:
Da häufig alle Dateien des Verzeichnisses durchsucht werden sollen
bietet sich für das Beispielmuster (wort1 UND wort2) folgendes an:
u = dateiname.dateityp
for u in 'ls';
do
echo $u:;
cat $u | grep - E 'wort1.*wort2|wort2.*wort1';
done | tee ergebnis.txt
Ziel ist die gleichzeitige Ausgabe auf dem Bildschirm und das Speichern
des Ergebnisses in einer Datei. Deshalb wird das Kommando tee verwendet.
Beispiel1:
Das Verzeichnis nur nach dem Dateien durchsuchen,
in deren Inhalt das Wort "Anleitungen" vorkommt:
for u in '/www/www.sr71.de/*.php'; do echo $u:; cat $u | grep
'Anleitungen'; done | tee ergebnis.txt
Beispiel2:
Das Verzeichnis nur nach Dateien durchsuchen, in
deren Inhalt die Wörter "Anleitungen" UND "font" vorkommen:
for u in '/www/www.sr71.de/*.php'; do echo $u:; cat $u | grep -E
'Anleitungen.*font | font.*Anleitungen'; done | tee ergebnis.txt
Weitere Beispiele:
Suche nach textmuster in datei:
grep 'textmuster' datei
Suche nach textmuster in datei1 und datei2
grep 'textmuster' datei1 datei2
Ausgabe des Ergebnisses aber in Datei
ergebnisdatei.txt, nicht auf Standardausgabe:
grep 'testmuster' datei1 datei2 > ergebnisdatei.txt
Suche nach testmuster in allen Dateien des
aktuellen Verzeichnisses:
grep 'testmuster' *
Suche in datei nach verbreiteten Schreibweisen
von Maier - es werden aber auch Zeichenketten als gültig erkannt, die
Meierei oder RMeyer lauten:
grep 'M[ae][iy]er' datei
Sucht nach Zeichenketten, die "ier" enthalten,
also z.B. hier, Bier, aber auch Stiere
grep '.ier' datei
Suche nach Zeilen in datei, die mit s oder S
beginnen
grep -i '^s' datei
grep '^[sS]' datei
Suche nach Zeichenketten, die a, a1, a11,
a11...1 lauten
grep 'a1*' datei
Sucht in datei nach Zeilen, die nur Exakte
Zeichenfolge einer Zeile enthalten:
grep '^Exakte Zeichenfolge einer Zeile$' datei
grep -x 'Exakte Zeichenfolge einer Zeile' datei
Suche nach Zeilen in datei, die nur Ziffern
enthalten oder leer sind:
grep '^[0-9][0-9]*$' datei
Suche in datei nach Zeichenketten, die mit a
anfangen, danach mindestens ein b oder c haben und mit "d" aufhören:
grep 'a[bc]+d' datei
Sucht in datei nach E.T.
grep 'E\.T\.' datei
.
Suche in zwei Dateien nach zwei Suchmustern:
grep -E -n 'Medieninformatik|Informatik' datei1 datei2
Sucht im
aktuellen Verzeichnis (in der Auflistung) nach Dateien, Ordnern, Links,
die alle Benutzer lesen können
ls -l | grep '^.r..r..r..'
Sucht im aktuellen Verzeichnis (in der
Auflistung) nach C-Programmen und txt-Dateien:
ls- l | grep '\.c|.txt$'
Suche im aktuellen Verzeichnis nach
Unterverzeichnissen:
ls -l | grep '^d'
(c)
Juergen Schilling 12.07.2009 |