grep este unul dintre cele mai utilizate instrumente de pe linia de comandă GNU / Linux. În ciuda faptului că este un instrument foarte simplu, vă permite să efectuați un număr mare de operații. Se folosește mai ales împreună cu țevi, pentru a putea localiza puncte specifice în ieșirea unei comenzi anterioare etc. Dar există și un instrument cunoscut sub numele de egrep, care este echivalent cu rularea grep cu opțiunea -E.
E provine din „Extended regex”, care activează opțiunea -E și ceea ce aveți în egrep în mod implicit, fără a utiliza acea opțiune. Adică, puteți utiliza expresii regulate extinse. În acest tutorial nu voi intra în a explica ce sunt expresiile regulate, cum pot fi utilizate și ce tipuri sunt în * nix. Voi arăta doar exemple practice ale unor lucruri utile pe care le puteți face cu egrep ...
grep, egrep și fgrep sunt similare. De fapt, egrep este echivalent cu grep -E și fgrep este echivalent cu grep -F. Adică, în cazul care ne privește, va interpreta și modelele ca expresii regulate.
Tu căutați o linie sau un cuvânt într-unul sau mai multe fișiere, la fel ca și în cazul grep. De exemplu, să presupunem că doriți să căutați cuvântul ubuntu într-un fișier numit snap.txt și, de asemenea, în toate fișierele .txt din directorul curent:
egrep ubuntu snap.txt
egrep ubuntu *.txt
Căutarea poate fi, de asemenea recursiv Pentru a căuta întregul conținut al directorului curent:
egrep -r "hola mundo" *
Până în prezent, au fost căutate cuvinte sau șiruri exacte, adică ținând cont de majuscule și minuscule (minuscule), dar dacă doriți să faceți acest lucru în modul nesensibil, indiferent dacă sunt majuscule sau mici, puteți utiliza următoarele (dacă adăugați w găsește doar potriviri complete):
egrep -i "ejemplo" documento.txt
egrep -iw "ejemplo" documento.txt
Arată nu coincidențele, ci numele fișierelor unde au fost găsite aceste potriviri:
egrep -l hola *.txt
Afișați doar modelul sau cuvântul căutat într-un document:
egrep -o printf hola.c
Amintiți-vă că puteți folosi toate posibilitățile pe care vi le puteți imagina. Puteți combina mai multe dintre opțiunile văzute anterior sau le puteți completa cu alte opțiuni, cum ar fi -A n și -B n, unde n numărul de linii pe care doriți să le afișați înainte (Înainte) și după (După) din meci sau ambele în același timp (C), astfel încât să puteți vedea ce înconjoară meciul:
egrep -A 2 "printf" hola.c
egrep -B 2 "printf" hola.c
egrep -C 2 printf hola.c
Suprimă liniile care conțin o potrivire și arată numai cele care nu se potrivesc:
egrep -v "dos" números.doc
Sau, dacă preferați, puteți utiliza mai multe cuvinte sau potriviri cu -e. De exemplu:
egrep -v -e "uno" -e "dos" -e "tres" números.txt
Dacă folosești -c poate număra doar numărul de meciuri, sau inversați-l cu -v pentru a afișa numărul de linii nepotrivite. De exemplu:
egrep -c "include" main.c
egrep -v -c "include" main.c
Și chiar arată numărul liniei unde a avut loc meciul și, de asemenea, poziția pe care o ocupă:
egrep -n "void" hola.c
egrep -o -b "printf" hola.c
Și împreună cu expresii obisnuite capacitățile sale pot fi extinse. De exemplu, găsiți o linie care începe cu Hello și se termină cu bye, sau care începe cu Hello urmată de orice și apoi apare potrivirea bye:
* Corectarea următoarei comenzi: datorită comentariului cititorului Manuel Alcocer am putut modifica următoarea comandă, deoarece a existat o eroare.
egrep '^Hola.*adiós$' ejemplo.txt
egrep "Hola.*adiós" ejemplo.txt
Dar dacă vă întrebați despre diferența cu grep, iată un exemplu care vă va da clar ... În cazul utilizării grep fără -E ar trebui să utilizați secvențe de evadare astfel încât să interpreteze caracterele speciale ca atare, altfel ar interpreta tiparul ca atare fără a le lua în considerare. Pe de altă parte, cu egrep sau grep -E le va lua în considerare. De exemplu:
grep '^no\(fork\|group\)' /etc/group
Acest lucru ar fi echivalent cu:
grep -E '^no(fork|group)' /etc/group
egrep '^no(fork|group)' /etc/group
Adică ar căuta liniile potrivite care încep cu nofork sau nogroup. Dar dacă ați folosi prima expresie grep fără secvențele de evadare, ceea ce ar face este să căutați tiparul concret nu (furculiță | grup):
grep 'no(fork|group)' /etc/group
De asemenea, puteți căuta intervale alfanumericesau valori specifice, cum ar fi localizarea anumitor adrese IP:
cat /etc/networks | egrep "192.168.1.[5-9]"
cat /etc/networks | egrep "192.168.[1-3].[5-9]"
cat /etc/networks | egrep "192.168.1.[0-3]|[5-9]"
egrep 192.168.4.[10,40] networks
Dacă preferați, puteți utiliza alte expresii regulate pentru a face căutări mai specifice. De exemplu | pentru a găsi una coincidență sau cealaltă:
egrep -i '^(printf|scanf)' hola.c
Puteți chiar localiza majuscule, minuscule, numai caractere alfabetice sau alfanumerice etc., folosind alte expresii precum: [: alnum:], [: alpha:], [: digit:], [: lower:], [: print:], [: punct:], [: space:], [: superior:], etc. De exemplu, pentru a căuta majuscule:
egrep [[:upper:]] diccioario
Sper că te va ajuta ... În curând voi explica expresiile regulate într-un articol dedicat special acestuia ...
Bună ziua.
Câteva remarci ...
Explicați comanda „egrep”, dar nu puneți diferența între „egrep” și „grep”, care ar trebui să fie ceea ce este aici.
De exemplu:
Cu grep: ip -4 a | grep '[0-9] \ +'
Cu egrep: ip -4 a | egrep '[0-9] +'
Ahh, iar acest lucru este greșit, 'egrep "Bună ziua. * Bye" example.txt'; succesul aici apare atunci când există o linie în fișier care conține șirul „Bună ziua” urmat de orice și urmat de „la revedere”, linia poate începe cu adevărat și se poate termina cu orice.
Acest lucru ar fi ceea ce spune articolul:
egrep '^ Hello. * bye $' example.txt
Și toate opțiunile, sau aproape toate (nu mă opresc să o verific), sunt opțiuni de „grep” nu de „egrep” exclusiv.
Cele mai bune urări.
Vă mulțumim că ați raportat această eroare. Ceea ce comentați asupra expresiilor regulate, l-am pus deja în al doilea paragraf. Le voi dedica un articol specific, pentru că sunt multe și acest articol ar dura prea mult. Un salut!
Bună ziua, Isaac.
În al doilea paragraf, practic spuneți sau ar fi trebuit să spuneți că „egrep” este un alias al „grep -E”, dar nu dați niciun exemplu de utilizare a „egrep” cu o expresie regulată care este scrisă diferit decât atunci când este utilizată de „ grep '.
Dedicarea unui articol pentru a explica expresii regulate extinse mi se pare îndrăzneață, printre altele, deoarece există site-uri de genul acesta care nu fac publicitate și fac o muncă informativă foarte importantă pentru comunitatea GNU: https://www.rexegg.com/
Nu scriu aici pentru trolling, intenția mea cu toate acestea este că dacă cineva citește această intrare pentru a vedea ce face „egrep” sau „grep”, te rog să te uiți la alte surse, această intrare nu se poate referi la nimic, explică puțin, rău , oferă informații de prisos și poate fi confuz, mai ales pentru cei care nu au cunoștințe despre GNU și instrumentele puternice pe care le oferă.
În cele din urmă, ați adăugat și remediat eroarea pe care am indicat-o după primul meu comentariu (^ $). Ca și în alte site-uri, ar fi trebuit să citați persoana care a făcut corecția sau, cel puțin, să spuneți că este o corecție, care face parte din baza GNU, aceeași bază cu care a fost lansat și a fost acest blog pierdut.
Un salut.
Vă mulțumim pentru punctul dvs. de vedere.
ffff