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, -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
egrepo fgrep; -Ee -Fsono standard. In realtà ci sono piccole incompatibilità in egrep: tratta in modo {leggermente diverso.
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).
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
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.
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.
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).