Qualcuno sa dirmi le differenze tecniche tra grep e egrep e fgrep e fornire esempi adeguati?

Quando devo utilizzare grep su egrep e viceversa?

Commenti

Risposta

Storicamente queste opzioni venivano fornite in binari separati. Su alcuni sistemi Unix molto vecchi scoprirai che devi chiamare i binari separati, ma su tutti i sistemi moderni gli switch sono preferiti. La pagina man di grep contiene dettagli su questo.

Per quanto riguarda ciò che fanno, -E commuta grep in una modalità speciale in modo che lespressione sia valutata come ERE (Extended Regular Expression) invece del suo normale corrispondenza del modello. I dettagli di questa sintassi si trovano nella pagina man.

-E, --extended-regexp
Interpreta PATTERN come un normale esteso espressione

Linterruttore -F commuta grep in una modalità diversa in cui accetta un modello da abbinare, ma poi divide quel pattern in una stringa di ricerca per riga ed esegue una ricerca OR su una qualsiasi delle stringhe senza eseguire alcuna corrispondenza di pattern speciale.

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

Ecco alcuni scenari di esempio:

  • Hai un file con un elenco di diciamo dieci nomi utente Unix in testo normale. Vuoi cercare nel file del gruppo sulla tua macchina per vedere se qualcuno dei dieci utenti elencati si trova in qualche gruppo speciale:

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

    Il motivo per cui -F switch aiuta qui è che i nomi utente nel tuo file di pattern vengono interpretati come stringhe di testo normale. I punti, ad esempio, vengono interpretati come punti anziché come caratteri jolly.

  • Si desidera eseguire la ricerca utilizzando unespressione di fantasia. Ad esempio, le parentesi () possono essere utilizzate per indicare gruppi con | utilizzato come operatore OR. Puoi eseguire questa ricerca utilizzando -E:

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

    … per restituire le righe che iniziano con “nofork “o” nogroup “. Senza lopzione -E dovresti eseguire lescape dei caratteri speciali coinvolti perché con la normale corrispondenza del modello cercherebbero solo quel modello esatto;

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

Commenti

  • Alcuni sistemi non ' hanno egrep o fgrep; -E e -F sono standard. In realtà sono presenti piccole incompatibilità in egrep: tratta { in modo leggermente diverso.
  • fgrep utilizza il backend Aho-Corasick, mentre grep utilizza una versione modificata di Commentz-Walter. Ciò significa che grep ha una complessità O (mn) nel caso peggiore mentre fgrep è nella peggiore O (m + n).
  • Gilles " au contraire mon capitan ", alcuni sistemi (forse più vecchi) potrebbero non avere lopzione -F per grep standard ma avere un fgrep, alcuni si lamentano di questo sul thread originale che ho scoperto di usare grep per caratteri speciali
  • Recentemente mi è capitato di trovare un sistema Android su cui egrep e grep -E sono stati gestiti da diversi eseguibili, BusyBox e BSD grep. Le due varianti presentavano differenze comportamentali per i costrutti regex non Posix, come \s. Ciò ha creato molta confusione …

Risposta

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

utilizzi fgrep o grep -F se non vuoi che la stringa greppata venga interpretata come un modello.

Utilizza egrep o grep -E se devi utilizzare unespressione regolare estesa.

Risposta

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.

Commenti

  • ok, ma che cosè è unespressione regolare estesa? ' non viene spiegato di seguito. Alcuni esempi sarebbero carini …
  • @isomorphismes: questo collegamento wikibooks lo spiega bene …

Risposta

Da “man grep”:

Sono disponibili tre varianti di programmi egrep, fgrep e rgrep. egrep è uguale a grep -E. fgrep è uguale a grep -F. rgrep è uguale a grep -r. Linvocazione diretta come egrep o fgrep è deprecata, ma viene fornita per consentire alle applicazioni storiche che si basano su di esse di essere eseguite senza modifiche.

Commenti

  • La domanda richiede un esempio appropriato.

Risposta

Se cerchi una stringa letterale e vuoi essere sicuro che la stringa che hai passato sia interpretata alla lettera (cioè senza rischiare che un punto o un punto interrogativo venga interpretato come qualcosaltro) 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 sembra risiedere nella sintassi: alcune cose richiedono barre mentre altre no. Penso che egrep sia più “compatibile” con perl regexps e javascript regexps quindi per me è più facile usare egrep.

Btw. Ti incoraggio davvero a provare ack : supporta i PREG e ha impostazioni predefinite più utili (ad esempio colorare, saltare le directory probabilmente non quello che vuoi come .svn, la capacità di seguire i collegamenti simbolici, ed è “un po più facile digitare ack rispetto a grep -E).

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *