Was sind die Vorteile von grep gegenüber egrep

1435
MYV

Ich lerne gerade etwas über die grep-Programmfamilie, und mir scheint, dass egrep gegenüber grep strikt überlegen ist - es kann alles, was grep kann, aber mehr. Liege ich falsch? Warum nicht einfach Egrep jedes Mal verwenden?

EDIT: Ich weiß, dass Grep -E dasselbe ist wie Egrep. Ich möchte wissen, warum grep -E nicht der Standardmodus für grep ist, da es nur die Benutzerfreundlichkeit erhöht und keine offensichtlichen Nachteile aufweist.

4

4 Antworten auf die Frage

16
Simon

Technische Antwort: Traditionell egrepwird ein deterministischer finiter Automat (DFA) intern verwendet, während grepein nicht deterministischer finiter Automat (NFA) verwendet wird. In diesen Tagen, GNU grepund egrepeinen hybriden NFA / DFA-Ansatz.

Laut Friedls Buch Mastering Regular Expressions können Sie herausfinden, ob Ihre egrepNFA-Engine (z. B.) über eine NFA-Engine oder eine DFA-Engine verfügt:

echo =XX========================================= | egrep 'X(.+)+X' 

Freidl (S.147) sagt:

Wenn es lange dauert, bis es fertig ist, ist es ein NFA ... Wenn es schnell fertig wird, ist es entweder ein DFA oder ein NFA mit einigen fortschrittlichen Optimierungen. Zeigt es eine Warnmeldung an, wenn ein Stack-Overow oder ein langer Match abgebrochen wurde? Wenn ja, ist es eine NFA.

Friedl bezeichnet die NFA-Engine als "regex-gerichtet" und die DFA als "textgesteuert". Die Einzelheiten der Unterscheidung werden ab S.153 seines Buches beschrieben.

Die Folge ist, dass es einige Muster / Text-Kombinationen gibt, die von einem DFA schneller abgeglichen werden, und andere, die von einem NFA schneller abgeglichen werden. Die Art und Weise, wie Sie einen Regex für einen NFA schreiben, kann die Geschwindigkeit des Abgleichs erheblich beeinflussen. Häufig ist ein DFA schneller, aber DFAs unterstützen kein Lazy-Matching. In einigen Fällen passen sie anders zusammen. Sie können keine Ausdrücke oder Rückverweise verwenden und lassen im Vergleich zu NFAs einige andere Funktionen aus.

Laut Freidl grepverwendet GNU wenn möglich einen DFA und kehrt bei Verwendung von Rückverweisen zu einem NFA zurück.

Soll es im Code-Snippet "egrep" oder "grep" sein? Nach dem, was Sie geschrieben haben, "egrep = DFA", sollte es nicht lange dauern, bis "egrep! = NFA" fertig ist. Nevin Williams vor 10 Jahren 0
Ich denke, Friedl bedeutet, dass das Beispiel zeigt, ob "egrep" in diesem Fall (oder "grep", wenn Sie "egrep" durch "grep" ersetzt haben) eine DFA oder NFA verwendet. Da andere Antworten darauf hingewiesen haben, dass unterschiedliche Implementierungen desselben Tools unterschiedliche Regex-Engines verwenden können, bedeutet die Tatsache, dass ein bestimmtes Tool, das herkömmlicherweise eine bestimmte Engine verwendet, nicht bedeutet, dass eine bestimmte Implementierung dieses Tools notwendigerweise denselben Motortyp verwendet. Simon vor 10 Jahren 0
2
terdon

Die "Familie" sind jeweils nur Verknüpfungen zu verschiedenen grepOptionen (von man grep):

Darüber hinaus stehen drei Variantenprogramme ( egrep, fgrep und rgrep) zur Verfügung. egrep ist das gleiche wie grep -E . fgrep ist dasselbe wie grep -F . rgrep ist das gleiche wie grep -r . Das direkte Aufrufen als egrep oder fgrep ist veraltet, wird jedoch bereitgestellt, um historischen Anwendungen, die von ihnen abhängig sind, die Ausführung ohne Änderungen zu ermöglichen.

 -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.)  -R, -r, --recursive Read all files under each directory, recursively; this is equivalent to the -d recurse option. 
1
InnerPortal

egrepist nur eine Abkürzung, bei grep -Eder erweiterte reguläre Ausdrücke verwendet werden können. Schauen Sie sich die Manpage für an egrep- sie öffnet die Manpage für die "Familie" der Mustersuchfunktionen wie grep, egrep, fgrep usw.

Wenn Sie erweiterte reguläre Ausdrücke verwenden, ist die Eingabe egrepmöglicherweise schneller als die Eingabe grep -E.

0
Nicole Hamilton

Der Nachteil egrepist, dass sein Regex etwas komplexer und weniger bequem ist, wenn Sie die zusätzliche Funktion nicht benötigen. Manchmal ist mehr Leistung nicht besser, wenn sie nicht so einfach und benutzerfreundlich ist.