it-swarm.com.de

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

Kann mir jemand die technischen Unterschiede zwischen grep, egrep und fgrep erklären und geeignete Beispiele liefern?

Wann muss ich grep über egrep verwenden und umgekehrt?

287
mr_eclair

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, so dass der Ausdruck als ERE (Extended Regular Expression) im Gegensatz zu seiner normalen Musterübereinstimmung ausgewertet wird. Details zu dieser Syntax finden Sie auf der Manpage.

-E, --extended-regexp
Interpretieren Sie MUSTER als erweiterten regulären Ausdruck

Der Schalter -F Schaltet grep in einen anderen Modus, in dem ein übereinstimmendes Muster akzeptiert wird, teilt dieses Muster dann jedoch in eine Suchzeichenfolge pro Zeile auf und führt eine OR Suche nach einem beliebigen Muster durch) der Saiten ohne spezielle Musterübereinstimmung.

-F, --fixed-strings
Interpretieren Sie PATTERN als eine Liste fester Zeichenfolgen, die durch Zeilenumbrüche getrennt sind und mit denen alle übereinstimmen sollen.

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 speziellen Gruppen befindet:

    grep -F -f user_list.txt /etc/group
    

    Der Grund, warum der Schalter -F Hier hilft, ist, dass die Benutzernamen in Ihrer Musterdatei als einfache Textzeichenfolgen interpretiert werden. Punkte würden beispielsweise eher als Punkte als als Platzhalter interpretiert.

  • Sie möchten mit einem ausgefallenen Ausdruck suchen. Zum Beispiel kann in Klammern () Gruppen angegeben werden, bei denen | Als Operator OR] verwendet wird. Sie können diese Suche mit -E Ausführen:

    grep -E '^no(fork|group)' /etc/group
    

    ... um Zeilen zurückzugeben, die entweder mit "nofork" oder "nogroup" beginnen. 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
    
304
Caleb

Von man grep:

 egrep ist dasselbe wie grep -E. 
 fgrep ist dasselbe wie grep -F. 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. 

Sie verwenden fgrep oder grep -F wenn Sie nicht möchten, dass die Grepped-Zeichenfolge als Muster interpretiert wird.

Sie verwenden egrep oder grep -E wenn Sie einen erweiterten regulären Ausdruck verwenden müssen.

33
rozcietrzewiacz

egrep und fgrep entsprechen im Wesentlichen grep -E und grep -F (beziehungsweise):

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

15

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 auf ihnen basieren, unverändert ausgeführt werden können.

8
Rufo El Magufo

Wenn Sie nach einer wörtlichen Zeichenfolge suchen und sicherstellen möchten, dass die übergebene Zeichenfolge wörtlich interpretiert wird (d. H. 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 manuelle Site 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 mehr ist "kompatibel" mit Perl-Regexps und Javascript-Regexps, daher ist es für mich einfacher, egrep zu verwenden.

Übrigens. Ich ermutige Sie wirklich, ack einen Versuch zu geben - es unterstützt PREGs und hat nützlichere Standardeinstellungen (dh Färben, Überspringen von Verzeichnissen wie .svn, wahrscheinlich nicht das, was Sie wollen, Fähigkeit, Symlinks zu folgen, und es ist ein bisschen einfacher, ack einzugeben als grep -E).

3
qbolec