Risposte:
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, -E
passa 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 -F
selettore 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 -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, 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' -E
interruttore 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
egrep
o fgrep
; -E
e -F
sono standard. In realtà ci sono piccole incompatibilità in egrep
: tratta in modo {
leggermente diverso.
fgrep
usa il backend di Aho-Corasick, mentre grep
usa una versione modificata di Commentz-Walter. Ciò significa che grep
ha una complessità O (mn) fgrep
nel peggiore dei casi, mentre è nella peggiore O (m + n).
egrep
e grep -E
sono state gestite da diversi eseguibili, BusyBox e BSD grep. Le due varianti presentavano differenze comportamentali per costrutti regex non Posix, come \s
. Ciò ha
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 fgrep
o grep -F
se non si desidera che la stringa grepped da interpretare come un modello.
Si utilizza egrep
o grep -E
se è necessario utilizzare una regexp estesa.
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.
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.
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).