Kann mir jemand die technischen Unterschiede zwischen grep, egrep und fgrep und geeignete Beispiele bereitstellen?

Wann muss ich grep über egrep und umgekehrt?

Kommentare

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 oder fgrep; -E und -F sind Standard. Es gibt tatsächlich kleine Inkompatibilitäten in egrep: { wird etwas anders behandelt.
  • fgrep verwendet das Aho-Corasick-Backend, während grep eine modifizierte Version von Commentz-Walter verwendet. Dies bedeutet, dass grep eine O (mn) -Komplexität im ungünstigsten Fall aufweist, während fgrep 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 und grep -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).

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.