grep to je jedan od najčešće korištenih alata na GNU / Linux naredbenom retku. Iako je vrlo jednostavan alat, omogućava vam izvođenje velikog broja operacija. Koristi se posebno zajedno s cijevima, kako bi mogao locirati određene točke u izlazu prethodne naredbe, itd. Ali postoji i alat poznat kao egrep koji je ekvivalentan pokretanju grepa s opcijom -E.
E dolazi iz "Proširenog regularnog izraza", što je ono što aktivira opciju -E i ono što imate u egrepu po defaultu bez upotrebe te opcije. Odnosno, možete koristiti prošireni regularni izrazi. U ovom vodiču neću ulaziti u objašnjavanje što su regularni izrazi, kako se mogu koristiti i koji su tipovi u * nixu. Pokazat ću vam samo praktične primjere nekih korisnih stvari koje možete učiniti s egrepom ...
grep, egrep i fgrep su slični. U stvari, egrep je ekvivalentan grep -E, a fgrep je ekvivalentan grep -F. Odnosno, u slučaju koji se tiče nas, također će interpretirati obrasce kao regularne izraze.
Možete potražite liniju ili riječ u jednoj ili više datoteka, kao što je slučaj i sa grep. Na primjer, pretpostavimo da želite tražiti riječ ubuntu u datoteci koja se naziva snap.txt, a također i u svim .txt datotekama u trenutnom direktoriju:
egrep ubuntu snap.txt
egrep ubuntu *.txt
Pretraživanje takođe može biti rekurzivno Da biste pretražili čitav sadržaj trenutnog direktorija:
egrep -r "hola mundo" *
Do sada su se pretraživale tačne riječi ili nizovi, tj. Uzimajući u obzir velika i mala slova (osjetljivo na velika i mala slova), ali ako to želite učiniti u načinu koji ne razlikuje velika i mala slova, bez obzira jesu li velika ili mala, možete koristiti sljedeće (ako dodate w pronalazi samo potpuna podudaranja):
egrep -i "ejemplo" documento.txt
egrep -iw "ejemplo" documento.txt
Pokažite, ne slučajnosti, ali imena datoteka u kojima su pronađena ta podudaranja:
egrep -l hola *.txt
Prikažite samo obrazac ili riječ pretraženo u dokumentu:
egrep -o printf hola.c
Zapamtite da možete iskoristiti sve mogućnosti koje možete zamisliti. Možete kombinirati nekoliko prethodno viđenih opcija ili ih možete nadopuniti drugim opcijama kao što su -A n i -B n, gdje n broj linija koje želite prikazati prije (prije) i nakon (poslije) utakmice ili oboje istovremeno (C), tako da možete vidjeti što okružuje utakmicu:
egrep -A 2 "printf" hola.c
egrep -B 2 "printf" hola.c
egrep -C 2 printf hola.c
Potisnite redove koji sadrže podudaranje i prikazuju samo one koji se ne podudaraju:
egrep -v "dos" números.doc
Ili ako želite, možete koristiti više riječi ili podudaranja s -e. Na primjer:
egrep -v -e "uno" -e "dos" -e "tres" números.txt
Ako koristite -c može računati samo broj podudaranja, ili ga obrnite sa -v da biste prikazali broj neusklađenih linija. Na primjer:
egrep -c "include" main.c
egrep -v -c "include" main.c
I čak prikaži broj linije gdje se utakmica dogodila, kao i pozicija koju zauzima:
egrep -n "void" hola.c
egrep -o -b "printf" hola.c
I zajedno sa regularni izrazi njegove mogućnosti se mogu proširiti. Na primjer, pronađite redak koji započinje s Hello i završava sa bye, ili koji započinje sa Hello nakon čega slijedi bilo što i tada se pojavljuje match bye:
* Ispravka sljedeće naredbe: zahvaljujući komentaru čitatelja Manuela Alcocera uspio sam izmijeniti sljedeću naredbu jer je došlo do pogreške.
egrep '^Hola.*adiós$' ejemplo.txt
egrep "Hola.*adiós" ejemplo.txt
Ali ako se pitate o razlici s grepom, evo primjera koji će vam to jasno pokazati ... U slučaju korištenja grepa bez -E trebali biste koristiti sekvence bijega tako da tumači posebne znakove kao takve, inače bi interpretirao obrazac kao takav ne uzimajući ih u obzir. S druge strane, s egrep ili grep -E će ih uzeti u obzir. Na primjer:
grep '^no\(fork\|group\)' /etc/group
To bi bilo ekvivalentno:
grep -E '^no(fork|group)' /etc/group
egrep '^no(fork|group)' /etc/group
Odnosno, tražio bi odgovarajuće linije koje počinju s nofork ili nogroup. Ali ako ste koristili grepov prvi izraz bez escape sekvenci, ono što bi učinilo je pretraživanje konkretni obrazac ne (vilica | grupa):
grep 'no(fork|group)' /etc/group
Takođe možete pretraživati alfanumerički rasponi, ili određene vrijednosti, poput lociranja određenih IP adresa:
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
Ako želite, možete koristiti druge regularne izraze za preciznija pretraživanja. Na primjer | da ga nađem slučajnost ili drugo:
egrep -i '^(printf|scanf)' hola.c
Možete čak i locirati veliko, malo, samo abecedni znakovi ili alfanumerički itd., koristeći druge izraze kao što su: [: alnum:], [: alfa:], [: cifra:], [: niža:], [: ispis:], [: punkt:], [: razmak:], [ : gornji:] itd. Na primjer, za pretraživanje velikih slova:
egrep [[:upper:]] diccioario
Nadam se da će vam pomoći ... Uskoro ću objasniti regularne izraze u članku posvećenom tome ...
Dobar dan.
Nekoliko napomena ...
Objasnili ste naredbu 'egrep', ali nemojte stavljati razliku između 'egrep' i 'grep', što bi ovdje trebalo biti ono što je.
Na primjer:
Sa grep: ip -4 a | grep '[0-9] \ +'
Sa egrepom: ip -4 a | egrep '[0-9] +'
Ahh, i ovo je pogrešno, 'egrep "Zdravo. * Ćao" example.txt'; ovdje se uspjeh događa kada u datoteci postoji redak koji sadrži niz 'Zdravo', iza čega slijedi i nakon čega slijedi 'zbogom', red zaista može započeti i završiti s čim god.
Ovo bi bilo ono što članak kaže:
egrep '^ Zdravo. * bye $' example.txt
I sve opcije, ili gotovo sve (ne prestajem provjeravati), opcije su 'grep', a ne isključivo 'egrep'.
Srdačan pozdrav.
Hvala što ste prijavili tu grešku. Ono što komentarišete regularne izraze, već sam stavio u drugi pasus. Posvetit ću im određeni članak, jer ih ima mnogo, a ovaj bi članak predugo trajao. Pozdrav!
Pozdrav ponovo, Isaac.
U drugom paragrafu u osnovi kažete, ili ste trebali reći, da je 'egrep' pseudonim 'grep -E', ali ne dajete nijedan primjer korištenja 'egrep' s nekim regularnim izrazom koji je napisan drugačije nego kada koristi 'grep'.
Posvećivanje članka za objašnjavanje proširenih regularnih izraza čini mi se odvažnim, između ostalog i zato što postoje web stranice poput ove koje se ne oglašavaju i rade vrlo važan informativni posao za GNU zajednicu: https://www.rexegg.com/
Ne pišem ovdje zbog trolanja, moja je namjera sa svime ovim da ako netko pročita ovaj unos da vidi što čini 'egrep' ili 'grep', molim pogledajte druge izvore, ovaj unos ne može biti referenca na bilo što, objašnjava malo, loše, nudi suvišne informacije i može zbuniti, posebno za one koji nemaju znanje o GNU-u i moćnim alatima koje on nudi.
Konačno, dodali ste i ispravili grešku koju sam naznačio nakon svog prvog komentara (^ $). Kao i na drugim web lokacijama, trebali ste citirati osobu koja je izvršila korekciju, ili barem reći da je to korekcija, koja je dio GNU baze, iste baze s kojom je ovaj blog pokrenut i izgubljen.
A pozdrav.
Hvala vam na vašem gledištu.
ffff