grep
grep [gɹɛp] ist ein Programm, das unter den Betriebssystemen Unix und Unix-Derivaten der Suche und Filterung definierter Zeichenketten aus Dateien oder Datenströmen dient. Es wurde ursprünglich von Ken Thompson entwickelt,[1] erschien erstmals als Teil von Version 6 AT&T UNIX und ist POSIX.1-konform.
Der Begriff grep steht für global/regular expression/print[2][3] oder auch global search for a regular expression and print out matched lines,[4] also etwa „globale Suche nach einem regulären Ausdruck und Ausgabe übereinstimmender Zeilen“. Historisch entwickelte sich der Name aus dem Kommando g/re/p des Unix-Editors QED, dem Vorgänger von ed.[5][6]
Es gibt verschiedene andere Programme mit ähnlichen Funktionen, beispielsweise agrep und Tre-agrep, die auch eine unscharfe Suche nach Textstrings ermöglichen.
Anwendung
In der Kommandozeile wird grep meist zur Suche in Dateien eingesetzt. Der Aufruf hat die Form:
grep [optionen] Suchstring [Datei(-liste)]
Der Befehl kann auch in Shell-Skripten, beispielsweise in Pipes, eingesetzt werden.
Durch Kommandozeilenschalter kann die Arbeitsweise von grep geändert werden.
Schalter | Wirkung |
---|---|
-v |
Alle Zeilen heraussuchen, die das angegebene Textmuster nicht enthalten. |
-w |
Nur Zeilen heraussuchen, in denen das Suchmuster als ganzes Wort enthalten ist. |
-n |
Die Zeilennummern, in denen der Text enthalten ist, ausgeben. |
-H |
Den Dateinamen aller Dateien ausgeben, die den angegebenen Text enthalten. |
Die GNU-Variante bietet darüber hinaus die Möglichkeit, nicht die komplette Zeile auszugeben, in der ein Ausdruck vorkommt, sondern lediglich alle Vorkommen des Ausdrucks selbst.
Das Beispiel extrahiert eine Zahl, nämlich die User-ID eines Accounts namens "rudi" aus der Datei "/etc/passwd".
$ grep -E -o "^rudi:x:[0-9]+" /etc/passwd | grep -o "[0-9]*$"
Einsatzgebiete
grep wird in erster Linie dann eingesetzt, wenn Dateien durchsucht werden müssen, zum Beispiel die Quelldateien eines Computerprogramms oder Logdateien. In Zusammenarbeit mit find kann ein ganzer Dateibaum gelesen werden.
$ find /home/benutzername -exec grep -H "Passwort" {} \;
Dieses Kommando durchsucht alle Dateien des Quellverzeichnisses des Benutzers benutzername 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.
Manche grep-Versionen ermöglichen eine kürzere Formulierung mit Hilfe der Option -r:
$ grep -r "Passwort" /home/benutzername
Ein zweites Einsatzgebiet ist die Verwendung als Zeilen-Filter innerhalb einer Kette von Befehlen, z. B.:
$ tail -1000 /var/log/mail | grep "Mailadresse"
Varianten
agrep
agrep (Approximate GREP) ist ein Programm, das nicht aus der Familie der UNIX-grep-Programme stammt. Im Gegensatz zu den Programmen der UNIX-grep-Familie ermöglicht es eine unscharfe (fuzzy) Textstringsuche.
agrep wurde in den Jahren 1988–1991 von Udi Manber[7] und Sun Wu an der Universität von Arizona entwickelt und bildet den Kern der Suchmaschine GLIMPSE bzw. HARVEST. Das Programm benutzt aus einer Vielzahl von eingebauten Suchalgorithmen denjenigen, der dem regulären Ausdruck der Benutzereingabe (Suchstring) am besten angepasst ist und die schnellste Suche ermöglicht.
Um 1996 wurde es erstmals nach OS/2 und DOS, später nach Windows portiert, und nach weiteren Verbesserungen wieder nach Linux.[8]
Während agrep früher nur unter einer eingeschränkten Lizenz benutzt werden konnte, die im Konflikt mit Absatz 1 der Open-Source-Definition stand, erreichten es die Entwickler, agrep am 18. September 2014 unter die freie ISC-Lizenz zu stellen.[9]
Tre-agrep
Mit Tre-agrep steht eine Neuimplementierung von agrep zur Verfügung, die unter der liberaleren BSD-Lizenz steht.[10][11]
egrep
egrep (Extended grep) ist zur einfacheren Suche mit erweiterten regulären Ausdrücken geeignet. So haben die Zeichen ? + { } | ( )
bei egrep eine besondere Bedeutung für den Ausdruck und müssen mit einem umgekehrten Schrägstrich (engl.: backslash) geschützt werden, wenn sie als Text gefunden werden sollen.
grep -E
leistet alles, was egrep geleistet hat, und der Aufruf egrep
gilt inzwischen als veraltet; er sollte in Skripten vermieden werden, da egrep
oft nur noch ein indirekter Aufruf von grep -E
ist und möglicherweise in Zukunft nicht mehr unterstützt wird.
fgrep
fgrep (f für fixed-strings) kann immer anstelle von grep verwendet werden, falls das zu suchende Muster keine regulären Ausdrücke enthält. Alle Sonderzeichen in der Musterzeichenkette verlieren ihre Sonderbedeutung und werden als Bestandteil des Musters verstanden. Fgrep arbeitet dadurch etwas schneller als grep und ist vor allem beim Durchsuchen großer Datenmengen nützlich. Man benutzt hierfür den Aho-Corasick-Algorithmus, der auch der Originalversion diente. Der Aufruf fgrep
sollte in Skripten vermieden werden, da fgrep oft nur noch aus Gründen der Abwärtskompatibilität existiert und dann meist auch nur ein indirekter, also umweghafter Aufruf von grep -F
ist.
Microsoft Windows
Wie von vielen Programmen gibt es auch Portierungen von grep auf die Windows-Plattform. Als eingebauten Befehl kennt Windows die Befehle find und findstr, die eine ähnliche Funktion wie grep erbringen. In den Resource Kit 2003 Tools ist QGREP.EXE enthalten.[12]
Der entsprechende PowerShell-Befehl lautet Select-String.[13]
Siehe auch
Einzelnachweise
- Brian Kernighan: A Regular Expression Matcher.
- grep Manual Punkt 16
- J. Plate: unix5 FH München
- Linuxfibel
- Félix López, Víctor Romero: Mastering Python Regular Expressions. Packt Publishing 2014, ISBN 978-1-78328-315-6. S. 7.
- Computerphile: Where GREP Came From - Computerphile. 6. Juli 2018, abgerufen am 8. Juli 2018 (englisch, Interview mit Brian W. Kernighan).
- Udi Manber in der englischsprachigen Wikipedia
- agrep Source code aller Versionen
- Details und weitere Informationen im englischsprachigen agrep-Artikel
- Charly Kühnast: Nimm zwei: Aus dem Alltag eines Sysadmin: Biabam und Tre-agrep. linux-magazin.de, Ausgabe 10/2012, S. 61
- laurikari.net/tre Informationen zu Tre-agrep
- Resource Kit Tools Windows Server 2003 (auch für Windows XP)
- sdwheeler: Select-String (Microsoft.PowerShell.Utility). In: docs.microsoft.com. 6. Juli 2018, abgerufen am 7. Juli 2018 (amerikanisches Englisch).