Kann mir jemand die technischen Unterschiede zwischen grep
, egrep
und fgrep
und geeignete Beispiele bereitstellen?
Wann muss ich grep
über egrep
und umgekehrt?
Kommentare
- Der Superuser zeigt die Unterschiede zwischen grep, egrep, fgrep und pgrep: superuser.com/questions/508881/…
Antwort
In der Vergangenheit wurden diese Switches in separaten Binärdateien bereitgestellt. Auf einigen wirklich alten Unix-Systemen müssen Sie die separaten Binärdateien aufrufen, auf allen modernen Systemen werden jedoch die Switches bevorzugt. Die Manpage für grep enthält Details dazu.
Was sie tun, -E
schaltet grep in einen speziellen Modus um, sodass der Ausdruck als ERE (Extended Regular Expression) im Gegensatz zu seinem normalen ausgewertet wird Mustervergleich. Details zu dieser Syntax finden Sie auf der Manpage.
-E, --extended-regexp
Interpretieren Sie PATTERN als erweiterten regulären Ausdruck
Der Schalter -F
schaltet grep in einen anderen Modus, in dem er ein passendes Muster akzeptiert, aber dann teilt dieses Muster in eine Suchzeichenfolge pro Zeile auf und führt eine ODER-Suche in einer der Zeichenfolgen durch, ohne dass ein spezieller Musterabgleich durchgeführt wird.
-F, --fixed-strings
Interpretieren Sie PATTERN als eine Liste fester Zeichenfolgen, die durch Zeilenumbrüche getrennt sind, von denen jede übereinstimmen soll.
Hier einige Beispielszenarien:
-
Sie haben eine Datei mit einer Liste von beispielsweise zehn Unix-Benutzernamen im Klartext. Sie möchten die Gruppendatei auf Ihrem Computer durchsuchen, um festzustellen, ob sich einer der zehn aufgelisteten Benutzer in einer bestimmten Gruppe befindet:
grep -F -f user_list.txt /etc/group
Der Grund für die
-F
Schalter hilft hier dabei, dass die Benutzernamen in Ihrer Musterdatei als einfache Textzeichenfolgen interpretiert werden. Punkte werden beispielsweise eher als Punkte als als Platzhalter interpretiert. -
Sie möchten mit einem ausgefallenen Ausdruck suchen. Beispielsweise kann in Klammern
()
verwendet werden, um Gruppen mit|
als ODER-Operator anzugeben. Sie können diese Suche mit-E
:grep -E "^no(fork|group)" /etc/group
ausführen, um Zeilen zurückzugeben, die mit „nofork“ beginnen „oder“ Nogruppe „. Ohne den Schalter
-E
müssten Sie sich den Sonderzeichen entziehen, da sie bei normalem Mustervergleich nur nach genau diesem Muster suchen würden;grep "^no\(fork\|group\)" /etc/group
Kommentare
- Einige Systeme ‚ haben
egrep
oderfgrep
;-E
und-F
sind Standard. Es gibt tatsächlich kleine Inkompatibilitäten inegrep
:{
wird etwas anders behandelt. -
fgrep
verwendet das Aho-Corasick-Backend, währendgrep
eine modifizierte Version von Commentz-Walter verwendet. Dies bedeutet, dassgrep
eine O (mn) -Komplexität im ungünstigsten Fall aufweist, währendfgrep
im schlimmsten Fall O (m + n) ist. - Gilles “ au contraire mon capitan „, einige Systeme (vielleicht älter) haben möglicherweise keine -F-Option für Standard-Grep, aber Ich habe ein fgrep, einige Leute beschweren sich darüber im ursprünglichen Thread, den ich über die Verwendung von grep für Sonderzeichen gefunden habe.
- Ich bin kürzlich auf ein Android-System gestoßen, auf dem
egrep
undgrep -E
wurden von verschiedenen ausführbaren Dateien, BusyBox und BSD grep, verarbeitet. Die beiden Varianten hatten Verhaltensunterschiede für Nicht-Posix-Regex-Konstrukte wie\s
. Dies führte zu viel Verwirrung …
Antwort
Von man grep
:
egrep is the same as grep -E. fgrep is the same as grep -F. Direct invocation as either egrep or fgrep is deprecated, but is provided to allow historical applications that rely on them to run unmodified.
Sie verwenden fgrep
oder grep -F
if Sie möchten nicht, dass die Zeichenfolge als Muster interpretiert wird.
Sie verwenden egrep
oder grep -E
, wenn Sie einen erweiterten regulären Ausdruck verwenden müssen.
Antwort
egrep
und fgrep
entspricht im Wesentlichen grep -E
und grep -F
(
):
-E, --extended-regexp Interpret PATTERN as an extended regular expression (ERE, see below). (-E is specified by POSIX.) -F, --fixed-strings Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched. (-F is specified by POSIX.)
Fehlermeldungen können jedoch abweichen.
Kommentare
- ok, aber was ist ein erweiterter regulärer Ausdruck? ‚ erklärt es unten nicht wirklich. Ein paar Beispiele wären nett …
- @isomorphismes: Dieser Wikibooks-Link erklärt es gut …
Antwort
Von „man grep“:
Es stehen drei Variantenprogramme egrep, fgrep und rgrep zur Verfügung. egrep ist dasselbe wie grep -E. fgrep ist dasselbe wie grep -F. rgrep ist dasselbe wie grep -r. Der direkte Aufruf als egrep oder fgrep ist veraltet, wird jedoch bereitgestellt, damit historische Anwendungen, auf die sie angewiesen sind, unverändert ausgeführt werden können.
Kommentare
- Die Frage fragt nach einem geeigneten Beispiel.
Antwort
If Sie suchen nach einer wörtlichen Zeichenfolge und möchten sicherstellen, dass die übergebene Zeichenfolge wörtlich interpretiert wird (dh ohne zu riskieren, dass ein Punkt oder ein Fragezeichen als etwas anderes interpretiert wird). Verwenden Sie fgrep oder egrep -F.
Was den Unterschied zwischen egrep und grep betrifft, denke ich, dass egrep die meiste Zeit das ist, was Sie wollen. Die GNU-Handbuchseite listet die Unterschiede zwischen grep und egrep auf, die in der Syntax zu liegen scheinen: Einige Dinge erfordern Schrägstriche, andere nicht. Ich denke, dass egrep mit Perl-Regexps und Javascript-Regexps „kompatibler“ ist, so dass es für mich einfacher ist, egrep zu verwenden.
Übrigens. Ich empfehle Ihnen wirklich, ack auszuprobieren – es unterstützt PREGs und hat nützlichere Standardeinstellungen (dh Färben, Überspringen von Verzeichnissen, die wahrscheinlich nicht das sind, was Sie wollen) wie .svn, die Fähigkeit, Symlinks zu folgen, und es ist ein bisschen einfacher, ack einzugeben als grep -E).