Kann mir jemand die technischen Unterschiede zwischen erzählen grep, egrepund fgrepund bieten geeignete Beispiele?
Wann muss ich grepüber , egrepund umgekehrt?
Kann mir jemand die technischen Unterschiede zwischen erzählen grep, egrepund fgrepund bieten geeignete Beispiele?
Wann muss ich grepüber , egrepund umgekehrt?
Antworten:
In der Vergangenheit wurden diese Schalter in separaten Binärdateien bereitgestellt. Auf einigen wirklich alten Unix-Systemen müssen Sie die separaten Binärdateien aufrufen, aber auf allen modernen Systemen werden die Switches bevorzugt. Die Manpage für grep enthält Details dazu.
Als für das, was sie tun, -Eschaltet grep in einen speziellen Modus , so dass der Ausdruck als ERE (Extended Regular Expression) bewertet wird als in den normalen Mustervergleich gegenüber . Details zu dieser Syntax finden Sie auf der Manpage.
-E, --extended-regexp
Interpretieren Sie PATTERN als erweiterten regulären Ausdruck
Der -FSchalter schaltet grep in einen anderen Modus, in dem er ein zu vergleichendes Muster akzeptiert, dieses Muster dann jedoch in eine Suchzeichenfolge pro Zeile aufteilt und eine ODER-Suche in einer der Zeichenfolgen durchführt, ohne dass ein spezieller Mustervergleich durchgeführt wird.
-F, --fixed-strings
Interpretieren Sie PATTERN als eine Liste fester Zeichenfolgen, die durch Zeilenumbrüche getrennt sind und mit denen übereinstimmen sollen.
Hier sind 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, warum der -FSchalter hier hilft, ist, dass die Benutzernamen in Ihrer Pattern-Datei als reine Textzeichenfolgen interpretiert werden. Punkte würden zum Beispiel eher als Punkte als als Platzhalter interpretiert.
Sie möchten mit einem ausgefallenen Ausdruck suchen. Beispielsweise ()können mit Klammern Gruppen angegeben werden, |die als OR-Operator verwendet werden. Sie können diese Suche ausführen mit -E:
grep -E '^no(fork|group)' /etc/group
... um Zeilen zurückzugeben, die entweder mit "nofork" oder "nogroup" beginnen. Ohne den -ESchalter müssten Sie die beteiligten Sonderzeichen umgehen, da sie bei normaler Mustererkennung nur nach genau diesem Muster suchen würden.
grep '^no\(fork\|group\)' /etc/group
egrepoder nicht fgrep; -Eund -Fsind Standard. Es gibt tatsächlich kleine Inkompatibilitäten egrep: Es wird {etwas anders behandelt .
fgrepverwendet das Aho-Corasick-Backend, während grepeine modifizierte Version von Commentz-Walter verwendet wird. Dies bedeutet, dass grepO (mn) im ungünstigsten Fall komplex ist, während fgrepO (m + n) im ungünstigsten Fall ist.
egrepund grep -Evon verschiedenen ausführbaren Dateien, BusyBox und BSD grep, gehandhabt wurden. Die beiden Varianten hatten Verhaltensunterschiede für Nicht-Posix-Regex-Konstrukte, wie z \s. Dies führte zu viel Verwirrung ...
Von man grep:
egrep ist dasselbe wie grep -E. fgrep ist dasselbe wie grep -F. Direktaufruf als egrep oder fgrep ist veraltet, wird jedoch bereitgestellt, um historische Anwendungen zu ermöglichen die darauf angewiesen sind, dass sie unverändert laufen.
Sie verwenden fgrepoder, grep -Fwenn Sie nicht möchten, dass der grepped String als Muster interpretiert wird.
Sie verwenden egrepoder grep -Ewenn Sie einen erweiterten regulären Ausdruck benötigen.
egrepund fgrepsind grundsätzlich äquivalent zu grep -Eund grep -F(bzw.):
-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 sich jedoch unterscheiden.
Aus "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, die darauf angewiesen sind, unverändert ausgeführt werden können.
Wenn Sie nach einer wörtlichen Zeichenfolge suchen und sicherstellen möchten, 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 Manual Site listet die Unterschiede zwischen grep und egrep auf, die anscheinend in der Syntax liegen: Einige Dinge erfordern Schrägstriche, andere nicht. Ich denke, dass egrep "kompatibler" mit Perl-regulären Ausdrücken und Javascript-regulären Ausdrücken ist, so dass es für mich einfacher ist, egrep zu verwenden.
Btw. Ich empfehle Ihnen dringend, es mit ack zu versuchen - es unterstützt PREGs und hat nützlichere Standardeinstellungen (z. B. Färben, Überspringen von Verzeichnissen wie .svn, Fähigkeit, Symlinks zu folgen, und etwas einfacher zu tippen) ack als grep -E).