Dateien durchsuchen mit grep
grep(1) durchsucht Dateien nach Suchbegriffen und gibt diese dann aus. Dabei wird immer die ganze Zeile mit dem gefundenen Suchbegriff ausgegeben. grep wird wie folgt benutzt:
# grep [Optionen] <Suchbegriff> <Datei>
Möchte man nach test1 in der testdatei suchen, so kann man dies folgendermassen tun:
# more testdatei
test1 bli
test2 bla
test3 blo
# grep test1 testdatei
test1 bli
Natürlich kann man die Ausgabe eines Programms mit einer Pipe direkt an grep weiterleiten:
# more testdatei | grep test2
test2 bla
Soll die Gross-/Kleinschreibung bei der Suche ignoriert werden, kann die -i Option verwendet werden:
# grep -i Test3 testdatei
test3 blo
Ein Begriff kann bei der Suche mit der -v Option ausgeschlossen werden, das heisst alle Zeilen die diesen Begriff nicht beinhalten werden angezeigt:
# grep -v test2 testdatei
test1 bli
test3 blo
Sollen mehrere Begriffe ausgeschlossen werden, so kommt egrep(1) zum Zuge. Die auszuschliessenden Begriffe sind mit einer Pipe zu trennen.
# egrep -v 'test1|test3' testdatei
test2 bla
Genauso wie auschliessen, lassen sich auch mehrere Suchbegriffe mit egrep kombinieren:
# egrep 'test1|test3' testdatei
test1 bli
test3 blo
Mit grep können auch Verzeichnisse rekursiv durchsuchen werden. Alle Dateien eines Verzeichnis und die Dateien der verschiedenen Unterverzeichnisse werden so durchsucht:
# grep -R <Suchbegriff> <Verzeichnis>
Möchte man nun statt den gefundenen Zeilen die Dateinamen ausgeben, in welchen der Suchbegriff gefunden wurde, kann man die -l Option hinzufügen:
# grep -Rl miau /usr/src/
/usr/src/contrib/ntp/html/notes.html
/usr/src/share/dict/web2
Für die Suchbegriffe können natürlich auch reguläre Ausdrücke (Regex) verwendet werden. Diese und alle weiteren Optionen die grep besitzt, sind in der Manpage grep(1) ausführlich beschrieben.
grep und egrep sind natürlich auf FreeBSD und OpenBSD im Basissystem vorhanden.
Comments
Hallo!
Wie würde die Syntax bei "egrep 'hier|da' $file" aussehen, wenn man bei "hier" ein "| cut" und bei "da" ein "| sed" benötigt?
grep -e "hier" | cut ... -e "da" | sed ... liefert:
hier hier ... da da ... und nicht
hier da hier da .... wie benötigt.
Danke vorab.