Poate cineva să-mi spună diferențele tehnice dintre grep
, egrep
și fgrep
și să furnizez exemple adecvate?
Când trebuie să folosesc grep
peste egrep
și invers?
Comentarii
- superutilizatorul are o ilustrare excelentă a diferențelor dintre grep, egrep, fgrep și pgrep: superuser.com/questions/508881/…
Răspuns
Din punct de vedere istoric, aceste comutatoare au fost furnizate în binare separate. Pe unele sisteme Unix cu adevărat vechi, veți descoperi că trebuie să apelați binare separate, dar pe toate sistemele moderne sunt preferate comutatoarele. Pagina de manual pentru grep conține detalii despre acest lucru.
În ceea ce privește ceea ce fac, -E
comută grep într-un mod special, astfel încât expresia să fie evaluată ca ERE (Extended Regular Expression) spre deosebire de normalul său potrivire de model. Detalii despre această sintaxă se află pe pagina manuală.
-E, --extended-regexp
Interpretează PATTERN ca regulat extins expresie
Comutatorul -F
comută grep într-un mod diferit în care acceptă un model care să se potrivească, dar apoi împarte acel model într-un singur șir de căutare pe linie și efectuează o căutare SAU pe oricare dintre șiruri fără a face nicio potrivire specială a modelului.
-F, --fixed-strings
Interpretează PATTERN ca o listă de șiruri fixe, separate prin linii noi, oricare dintre acestea urmând să fie potrivite.
Iată câteva exemple de scenarii:
-
Aveți un fișier cu o listă de zece nume de utilizator Unix în text simplu. Doriți să căutați fișierul de grup pe computerul dvs. pentru a vedea dacă vreunul dintre cei zece utilizatori enumerați face parte din grupuri speciale:
grep -F -f user_list.txt /etc/group
Motivul pentru care
-F
ajută aici că numele de utilizator din fișierul dvs. de model sunt interpretate ca șiruri de text simplu. Punctele, de exemplu, ar fi interpretate mai degrabă ca puncte, decât ca wild-cards. -
Doriți să căutați utilizând o expresie fantezie. De exemplu, paranteza
()
poate fi utilizată pentru a indica grupuri cu|
utilizate ca operator SAU. Puteți rula această căutare folosind-E
:grep -E "^no(fork|group)" /etc/group
… pentru a returna liniile care încep cu „nofork” „sau” nogrup „. Fără comutatorul
-E
, ar trebui să scăpați de caracterele speciale implicate, deoarece, cu potrivirea normală a modelului, ar căuta doar acel model exact;grep "^no\(fork\|group\)" /etc/group
Comentarii
- Unele sisteme nu ' nu au
egrep
saufgrep
-E
și-F
sunt standard. De fapt, există mici incompatibilități înegrep
: tratează{
ușor diferit. -
fgrep
utilizează backend-ul Aho-Corasick, în timp cegrep
folosește o versiune modificată a Commentz-Walter. Acest lucru înseamnă căgrep
are o complexitate de cel mai rău caz O (mn), în timp cefgrep
este cel mai rău O (m + n). - Gilles " au contraire mon capitan ", este posibil ca unele sisteme (mai vechi poate) să nu aibă opțiunea -F la grep standard, dar au un fgrep, unii ppl se plâng de asta pe firul original pe care l-am găsit despre utilizarea grep pentru caractere speciale
- Am apărut recent pe un sistem Android pe care
egrep
șigrep -E
au fost tratate de diferite executabile, BusyBox și BSD grep. Cele două variante au avut diferențe de comportament pentru constructele regex non-Posix, cum ar fi\s
. Acest lucru a dus la multă confuzie …
Răspuns
Din 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.
Folosiți fgrep
sau grep -F
dacă nu „t doriți ca șirul grepped să fie interpretat ca un model.
Folosiți egrep
sau grep -E
dacă trebuie să utilizați o regexp extinsă.
Răspuns
egrep
și fgrep
sunt practic echivalente cu grep -E
și grep -F
(respectiv):
-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.)
Mesajele de eroare pot diferi.
Comentarii
- ok, dar ce este o expresie regulată extinsă? Nu ' chiar explică mai jos. Câteva exemple ar fi drăguțe …
- @isomorphismes: Acest link-ul wikibooks îl explică frumos …
Răspuns
Din „man grep”:
sunt disponibile trei variante de programe egrep, fgrep și rgrep. egrep este același cu grep -E. fgrep este la fel ca grep -F. rgrep este același cu grep -r. Invocarea directă ca egrep sau fgrep este depreciată, dar este furnizată pentru a permite aplicațiilor istorice care se bazează pe acestea să ruleze nemodificate.
Comentarii
- Întrebarea solicită un exemplu adecvat.
Răspuns
Dacă căutați un șir textual și doriți să vă asigurați că șirul pe care l-ați trecut este interpretat textual (adică fără a risca să spuneți că un punct sau un semn de întrebare va fi interpretat ca altceva) folosiți fgrep sau egrep -F.
În ceea ce privește diferența dintre egrep și grep, cred că egrep este de cele mai multe ori ceea ce doriți. Site-ul manual GNU enumeră diferențele dintre grep și egrep care par să stea în sintaxă: unele lucruri necesită bare oblice, în timp ce altele nu. Cred că egrep este mai „compatibil” cu regexps perl și regexps javascript, așa că îmi este mai ușor să folosesc egrep.
Btw. Vă încurajez într-adevăr să încercați ack – acceptă PREG-uri și are valori implicite mai utile (de exemplu, colorarea, omiterea directoarelor probabil-nu-ce-doriți) cum ar fi .svn, abilitatea de a urmări linkurile simbolice și „este puțin mai ușor să tastați ack decât grep -E).