Qual è la differenza tra `grep`,` egrep` e `fgrep`?


Risposte:


292
  • egrep è equivalente al 100% a grep -E
  • fgrep è equivalente al 100% a grep -F

Storicamente questi switch sono stati forniti in binari separati. Su alcuni sistemi Unix molto vecchi troverai che devi chiamare i binari separati, ma su tutti i sistemi moderni sono preferiti gli switch. La pagina man di grep contiene dettagli al riguardo.

Per quanto riguarda ciò che fanno, -Epassa a grep in una modalità speciale in modo che l'espressione venga valutata come ERE (Extended Regular Expression) in contrapposizione al suo normale pattern matching. I dettagli di questa sintassi si trovano nella pagina man.

-E, --extended-regexp
Interpreta PATTERN come un'espressione regolare estesa

Il -Fselettore passa grep in una modalità diversa in cui accetta un pattern da abbinare, ma poi divide quel pattern in una stringa di ricerca per riga e fa una ricerca OR su una qualsiasi delle stringhe senza fare alcuna corrispondenza speciale del pattern.

-F, --fixed-strings
Interpreta PATTERN come un elenco di stringhe fisse, separate da nuove righe, ognuna delle quali deve essere abbinata.

Ecco alcuni scenari di esempio:

  • Hai un file con un elenco di dieci nomi utente Unix in chiaro. Vuoi cercare il file di gruppo sul tuo computer per vedere se uno dei dieci utenti elencati fa parte di gruppi speciali:

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

    Il motivo per cui lo -Fswitch aiuta qui è che i nomi utente nel file di pattern vengono interpretati come stringhe di testo semplice. I punti, ad esempio, verrebbero interpretati come punti anziché come caratteri jolly.

  • Vuoi cercare usando un'espressione elegante. Ad esempio, la parentesi ()può essere utilizzata per indicare gruppi |utilizzati come operatore OR. È possibile eseguire questa ricerca utilizzando -E:

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

    ... per restituire le righe che iniziano con "nofork" o "nogroup". Senza l' -Einterruttore dovresti sfuggire ai personaggi speciali coinvolti perché con la normale corrispondenza dei modelli avrebbero semplicemente cercato quel modello esatto;

    grep '^no\(fork\|group\)' /etc/group
    

17
Alcuni sistemi non hanno egrepo fgrep; -Ee -Fsono standard. In realtà ci sono piccole incompatibilità in egrep: tratta in modo {leggermente diverso.
Gilles,

4
fgrepusa il backend di Aho-Corasick, mentre grepusa una versione modificata di Commentz-Walter. Ciò significa che grepha una complessità O (mn) fgrepnel peggiore dei casi, mentre è nella peggiore O (m + n).
Slater Victoroff,

2
Gilles "au contraire mon capitan", alcuni sistemi (forse più vecchi) potrebbero non avere l'opzione -F per grep standard ma hanno un fgrep, alcuni ppl si lamentano di ciò sul thread originale che ho trovato sull'uso di grep per personaggi speciali
THESorcerer

Recentemente mi è capitato su un sistema Android su cui egrepe grep -Esono state gestite da diversi eseguibili, BusyBox e BSD grep. Le due varianti presentavano differenze comportamentali per costrutti regex non Posix, come \s. Ciò ha
creato

33

Da man grep:

 egrep è uguale a grep -E.
 fgrep è uguale a grep -F. Invocazione diretta come egrep o  
  fgrep è obsoleto, ma viene fornito per consentire le applicazioni storiche
  che si basano su di loro per funzionare senza modifiche.

Si utilizza fgrepo grep -Fse non si desidera che la stringa grepped da interpretare come un modello.

Si utilizza egrepo grep -Ese è necessario utilizzare una regexp estesa.


13

egrepe fgrepsono sostanzialmente equivalenti a grep -Ee grep -F(rispettivamente):

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

I messaggi di errore potrebbero tuttavia differire.


2
ok, ma ciò che è un'espressione regolare estesa? Non spiega davvero di seguito. Alcuni esempi sarebbero belli ...
isomorfismi

@isomorphismes: questo link wikibooks lo spiega bene ...
zb226

8

Da "man grep":

sono disponibili tre programmi varianti egrep, fgrep e rgrep. egrep è uguale a grep -E. fgrep è uguale a grep -F. rgrep è uguale a grep -r. L'invocazione diretta come egrep o fgrep è deprecata, ma viene fornita per consentire l'esecuzione senza modifiche delle applicazioni storiche che fanno affidamento su di esse.


2
La domanda richiede un esempio adeguato.
isomorfismi,

3

Se cerchi una stringa testuale e vuoi essere sicuro che la stringa che hai passato sia interpretata alla lettera (cioè senza rischiare di dire che un punto o un punto interrogativo verrà interpretato come qualcos'altro) usa fgrep o egrep -F.

Per quanto riguarda la differenza tra egrep e grep, penso che egrep sia il più delle volte la cosa che vuoi. Il sito del manuale GNU elenca le differenze tra grep ed egrep che sembrano risiedere nella sintassi: alcune cose richiedono barre, altre no. Penso che egrep sia più "compatibile" con perl regexps e javascript regexps, quindi è più facile per me usare egrep.

Btw. Ho davvero vi incoraggio a dare ack una prova - supporta pregs, e ha di default più utili (ad esempio colorazione, saltando le directory probabilmente-non-what-you-want come .svn, capacità di seguire i link simbolici, ed è un po 'più facile da digitare ack di grep -E).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.