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?
grep
regular-expression
mr_eclair
quelle
quelle
Antworten:
egrep
ist 100% äquivalent zugrep -E
fgrep
ist 100% äquivalent zugrep -F
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.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.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:
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
:... 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.quelle
egrep
oder nichtfgrep
;-E
und-F
sind Standard. Es gibt tatsächlich kleine Inkompatibilitätenegrep
: Es wird{
etwas anders behandelt .fgrep
verwendet das Aho-Corasick-Backend, währendgrep
eine modifizierte Version von Commentz-Walter verwendet wird. Dies bedeutet, dassgrep
O (mn) im ungünstigsten Fall komplex ist, währendfgrep
O (m + n) im ungünstigsten Fall ist.egrep
undgrep -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
:Sie verwenden
fgrep
oder,grep -F
wenn Sie nicht möchten, dass der grepped String als Muster interpretiert wird.Sie verwenden
egrep
odergrep -E
wenn Sie einen erweiterten regulären Ausdruck benötigen.quelle
egrep
undfgrep
sind grundsätzlich äquivalent zugrep -E
undgrep -F
(bzw.):Fehlermeldungen können sich jedoch unterscheiden.
quelle
Aus "man grep":
quelle
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).
quelle