Was ist der Unterschied zwischen "grep", "egrep" und "fgrep"?


Antworten:


292
  • egrep ist 100% äquivalent zu grep -E
  • fgrep ist 100% äquivalent zu grep -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, -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
    

17
Einige Systeme haben egrepoder nicht fgrep; -Eund -Fsind Standard. Es gibt tatsächlich kleine Inkompatibilitäten egrep: Es wird {etwas anders behandelt .
Gilles

4
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.
Slater Victoroff

2
Gilles "au contraire mon capitan", einige Systeme (älter vielleicht) haben keine -F-Option für Standard-Grep, haben aber eine fgrep, einige ppl beschweren sich darüber auf dem ursprünglichen Thread, den ich über die Verwendung von Grep für Sonderzeichen gefunden habe
THESorcerer

Ich bin kürzlich auf ein Android-System gestoßen, auf dem 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 ...
Lii

33

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.


13

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.


2
ok, aber was ist ein erweiterter regulärer Ausdruck? Es wird unten nicht wirklich erklärt. Ein paar Beispiele wären schön ...
Isomorphismen

@ Isomorphismen: Dieser Wikibooks-Link erklärt es schön ...
zb226

8

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.


2
Die Frage fragt nach einem geeigneten Beispiel.
Isomorphismen

3

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).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.