it-swarm.it

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

Qualcuno può dirmi le differenze tecniche tra grep, egrep e fgrep e fornire esempi adeguati?

Quando devo usare grep su egrep e viceversa?

287
mr_eclair
  • 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.

Quanto a ciò che fanno, -E passa a grep in una modalità speciale in modo che l'espressione sia valutata come ERE (Extended Regular Expression) in contrapposizione alla sua normale corrispondenza del pattern. I dettagli di questa sintassi si trovano nella pagina man.

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

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

-F, --fixed-strings
Interpreta PATTERN come un elenco di stringhe fisse, separate da newline, 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 appartiene a gruppi speciali:

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

    Il motivo per -F switch 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 parentesi () può essere utilizzato per indicare gruppi con | usato come OR. Puoi eseguire questa ricerca usando -E:

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

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

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

A partire dal man grep:

 egrep è uguale a grep -E. 
 fgrep è uguale a grep -F. L'invocazione diretta come egrep o 
 Fgrep è obsoleta, ma viene fornita per consentire alle applicazioni storiche 
 Che si basano su di esse di essere eseguite senza modifiche. 

Si utilizza fgrep o grep -F se non vuoi che la stringa grepped sia interpretata come un pattern.

Si utilizza egrep o grep -E se devi usare un regexp esteso.

33
rozcietrzewiacz

egrep e fgrep sono sostanzialmente equivalenti a grep -E e 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.

15

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.

8
Rufo El Magufo

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 GN elenca le differenze tra grep ed egrep che sembra risiedere nella sintassi: alcune cose richiedono barre mentre altre no. Penso che egrep sia più "compatibile" con Perl regexps e javascript regexps, quindi è più facile per me usare egrep.

Btw. Ti incoraggio davvero a provare ack un tentativo - supporta i PREG e ha impostazioni predefinite più utili (ad es. Colorazione, salto delle directory probabilmente non-come-vuoi-come -svn, capacità di seguire collegamenti simbolici, ed è un po 'più semplice digitare ack di grep -E).

3
qbolec