Kann mir jemand die technischen Unterschiede zwischen erzählen grep
, egrep
und fgrep
und bieten geeignete Beispiele?
Wann muss ich grep
über , egrep
und umgekehrt?
Kann mir jemand die technischen Unterschiede zwischen erzählen grep
, egrep
und fgrep
und bieten geeignete Beispiele?
Wann muss ich grep
über , egrep
und 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, -E
schaltet 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 -F
Schalter 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 -F
Schalter 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 -E
Schalter 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
egrep
oder nicht fgrep
; -E
und -F
sind Standard. Es gibt tatsächlich kleine Inkompatibilitäten egrep
: Es wird {
etwas anders behandelt .
fgrep
verwendet das Aho-Corasick-Backend, während grep
eine modifizierte Version von Commentz-Walter verwendet wird. Dies bedeutet, dass grep
O (mn) im ungünstigsten Fall komplex ist, während fgrep
O (m + n) im ungünstigsten Fall ist.
egrep
und grep -E
von 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 fgrep
oder, grep -F
wenn Sie nicht möchten, dass der grepped String als Muster interpretiert wird.
Sie verwenden egrep
oder grep -E
wenn Sie einen erweiterten regulären Ausdruck benötigen.
egrep
und fgrep
sind grundsätzlich äquivalent zu grep -E
und 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).