Korištenje grepa (i egrepa) s regularnim izrazima

Using Grep With Regular Expressions



Ovaj vodič opisuje kako koristiti oboje zahvat (i čaplja) t o pronaći tekst u datotekama, u njihovom jednostavnom obliku i u kombinaciji s regularnim izrazima. Sadrži nekoliko primjere i vježbe , više rješenja , kako bi gledatelj dovršio.

Ime zahvat dolazi iz naredbe ed (i vim) g/re/p, što znači globalno tražiti zadani regularni izraz i ispisati (prikazati) izlaz.







Redovito Izrazi

Uslužni programi omogućuju korisniku pretraživanje tekstualnih datoteka za retke koji odgovaraju regularnom izrazu ( regexp ). Regularni izraz je niz za pretraživanje sastavljen od teksta i jednog ili više od 11 posebnih znakova. Jednostavan primjer je podudaranje početka retka.



Primjer datoteke

Osnovni oblik zahvat mogu se koristiti za pronalaženje jednostavnog teksta unutar određene datoteke ili datoteka. Kako biste isprobali primjere, najprije stvorite datoteku uzorka.



Upotrijebite uređivač, poput nano ili vim, da biste donji tekst kopirali u datoteku pod nazivom myfile .





xyz
xyzde
exyzd
dexyz
d? gxyz
xxz
xzz
x z
x*z
xz
x z
XYZ
XYYZ
xYz
xyyz
xyyyz
xyyyyz

Iako možete kopirati i zalijepiti primjere u tekst (imajte na umu da se dvostruki navodnici možda neće pravilno kopirati), naredbe je potrebno upisati kako biste ih pravilno naučili.

Prije isprobavanja primjera pogledajte oglednu datoteku:



$mačkamyfile

Jednostavno pretraživanje

Da biste pronašli tekst 'xyz' unutar datoteke, pokrenite sljedeće:

$zahvatxyz moja datoteka

Korištenje boja

Za prikaz boja upotrijebite –color (dvostruka crtica) ili jednostavno stvorite pseudonim. Na primjer:

$zahvat --bojaxyz moja datoteka

ili

$alias zahvat= ’zahvat--boja'
$zahvatxyz moja datoteka

Opcije

Uobičajene opcije koje se koriste s zahvat naredbe uključuju:

  • -nalazim sve retke bez obzira slučaja
  • -c računati koliko redaka sadrži tekst
  • -n linija prikaza brojevima odgovarajućih linija
  • -samo na ekranu datoteka imena ta utakmica
  • -r ponavljajući pretraživanje poddirektorija
  • -v pronaći sve retke NE koji sadrži tekst

Na primjer:

$zahvat -ixyz moja datoteka# pronaći tekst bez obzira na veličinu slova

$zahvat -icxyz moja datoteka# broj redaka s tekstom

$zahvat -uxyz moja datoteka# prikazuju brojeve redaka

Stvorite više datoteka

Prije nego pokušate pretraživati ​​više datoteka, prvo stvorite nekoliko novih datoteka:

$izbacitixyz>myfile1
$izbaciti -Ixyz nxzz nXYZ>myfile2
$izbaciti -Ixxx nyyy>myfile3
$mačkamyfile1
$mačkamyfile2
$mačkamyfile3

Pretražite više datoteka

Za pretraživanje više datoteka pomoću naziva datoteka ili zamjenskog znaka unesite:

$zahvat -icxyz moja datoteka myfile1 myfile2 myfile3
$zahvat -uxyz moj*
# podudaraju se nazivi datoteka koji počinju s 'moj'

Vježba I.

  1. Prvo izbrojite koliko redaka ima u datoteci /etc /passwd.
Savjet: upotrijebitezahod - /itd/passwd
  1. Sada pronađite sve pojave teksta gdje u datoteci /etc /passwd .
  2. Saznajte koliko redaka u datoteci sadrži tekst
  3. Saznajte koliko redaka NE sadrži tekst gdje .
  4. Pronađite unos za svoju prijavu u /etc/passwd

Rješenja za vježbe možete pronaći na kraju ovog članka.

Korištenje regularnih izraza

Naredba zahvat mogu se koristiti i s regularnim izrazima pomoću jednog ili više od jedanaest posebnih znakova ili simbola za preciziranje pretraživanja. Regularni izraz je niz znakova koji uključuje posebne znakove koji omogućuju podudaranje uzoraka unutar pomoćnih programa, kao što je zahvat , došao sam i sed . Imajte na umu da će nizove možda trebati staviti u navodnike.

Dostupni posebni znakovi uključuju:

^ Početak linije
$ Kraj reda
. Bilo koji znak (osim n novog retka)
* 0 ili više prethodnih izraza
Prethodni simbol čini ga doslovnim znakom

Imajte na umu da *, koji se može koristiti u naredbenom retku za podudaranje s bilo kojim brojem znakova, uključujući nijedan, jest ne ovdje se koristi na isti način.

Također obratite pozornost na upotrebu navodnika u sljedećim primjerima.

Primjeri

Da biste pronašli sve retke koji počinju s tekstom pomoću znaka ^:

$zahvat‘^Xyz’ moja datoteka

Da biste pronašli sve retke koji završavaju tekstom koristeći znak $:

$zahvat'Xyz $' myfile

Da biste pronašli retke koji sadrže niz pomoću znakova ^ i $:

$zahvat‘^Xyz $’ moja datoteka

Da biste pronašli retke pomoću . odgovara bilo kojem liku:

$zahvat‘^X.z’ moja datoteka

Da biste pronašli retke pomoću * koji odgovaraju 0 ili više prethodnog izraza:

$zahvat‘^Xy*z ’myfile

Da biste pronašli retke pomoću.* Koji odgovaraju 0 ili više bilo kojeg znaka:

$zahvat‘^ X.*z ’myfile

Da biste pronašli retke pomoću za izbjegavanje znaka *:

$zahvat‘^ X *z ’myfile

Da biste pronašli znak, upotrijebite:

$zahvat‘\’ moja datoteka

Izraz grep - egrep

The zahvat naredba podržava samo podskup dostupnih regularnih izraza. Međutim, naredba čaplja:

  • dopušta potpunu uporabu svih regularnih izraza
  • može istodobno tražiti više od jednog izraza

Imajte na umu da izrazi moraju biti zatvoreni u par navodnika.

Za upotrebu boja upotrijebite –color ili ponovno stvorite pseudonim:

$alias egrep='čaplja -boja'

Da biste tražili više od jednog regeks the egrep naredba se može zapisati u više redaka. Međutim, to se može učiniti i pomoću ovih posebnih znakova:

| Alternacija, jedno ili drugo
(…) Logičko grupiranje dijela izraza
$egrep '(^root |^uucp |^pošta)' /itd/passwd

Ovo izdvaja retke koji počinju s root, uucp ili mail iz datoteke, | simbol koji znači bilo koju od opcija.

Sljedeća naredba će ne rada, iako se ne prikazuje poruka, budući da je osnovni zahvat naredba ne podržava sve regularne izraze:

$zahvat '(^root |^uucp |^pošta)' /itd/passwd

Međutim, na većini Linux sustava naredba grep -E isto je kao i korištenje egrep :

$zahvat -I '(^root |^uucp |^pošta)' /itd/passwd

Korištenje filtera

Cijevi je proces slanja rezultata jedne naredbe kao ulaz u drugu naredbu i jedan je od najmoćnijih dostupnih Linux alata.

Naredbe koje se pojavljuju u cjevovodu često se nazivaju filterima jer u mnogim slučajevima prosiju ili mijenjaju ulaz koji im je proslijeđen prije slanja izmijenjenog toka na standardni izlaz.

U sljedećem primjeru standardni izlaz iz ls -l se prenosi kao standardni ulaz u zahvat naredba. Izlaz iz zahvat naredba se zatim prenosi kao ulaz u više naredba.

Ovo će prikazati samo direktorije u /itd :

$ls - /itd|zahvat‘^D’|više

Sljedeće naredbe su primjeri korištenja filtara:

$p.s -ef|zahvatcron

$tko|zahvatkdm

Primjer datoteke

Kako biste isprobali vježbu pregleda, prvo stvorite sljedeću datoteku uzorka.

Upotrijebite uređivač, poput nano ili vim, da biste donji tekst kopirali u datoteku pod nazivom narod:

Osobni J.Smith 25000
Osobni E.Smith 25400
Trening A.Brown 27500
Obuka C.Browen 23400
(Admin) R.Bron 30500
Goodsout T.Smyth 30000
Osobni F.Jones 25000
obuka* C.Evans 25500
Goodsout W.Pope 30400
Prizemlje T.Smythe 30500
Osobni J.Maler 33000

Vježba II

  1. Prikažite datoteku narod i ispitati njegov sadržaj.
  2. Pronađite sve retke koji sadrže niz Smith u datoteci people.Savjet: upotrijebite naredbu grep, ali zapamtite da prema zadanim postavkama razlikuju velika i mala slova.
  3. Napravite novu datoteku, npeople, koja sadrži sve retke koji počinju nizom Osobni u datoteci ljudi. Savjet: upotrijebite naredbu grep s>.
  4. Popis datoteke potvrdite npeople sadržajem datoteke.
  5. Sada dodajte sve retke gdje tekst završava nizom 500 u datoteci ljudi u datoteku npeople.Savjet: upotrijebite naredbu grep s >>.
  6. Ponovno potvrdite sadržaj datoteke npeople navođenjem datoteke.
  7. Pronađite IP adresu poslužitelja koja je pohranjena u datoteci /etc/hosts .Savjet: upotrijebite naredbu grep s $ (hostname)
  8. Koristiti egrep izdvojiti iz /etc/passwd linije računa računa datoteka koje sadrže lp ili svoje korisnički ID .

Rješenja za vježbe možete pronaći na kraju ovog članka.

Više regularnih izraza

Regularni izraz može se smatrati zamjenskim znakovima na steroidima.

Postoji jedanaest znakova s ​​posebnim značenjem: početna i zatvarajuća uglasta zagrada [], kosa crta , kareta ^, znak dolara $, točka ili točka., Okomita traka ili simbol cijevi |, upitnik?, zvjezdica ili zvjezdica *, znak plus + i okrugla zagrada za otvaranje i zatvaranje {}. Ovi posebni znakovi često se nazivaju i metaznakovima.

Ovdje je cijeli skup posebnih znakova:

^ Početak linije
$ Kraj reda
. Bilo koji znak (osim n novog retka)
* 0 ili više prethodnih izraza
| Alternacija, jedno ili drugo
[…] Eksplicitan skup znakova za podudaranje
+ 1 ili više prethodnih izraza
? 0 ili 1 prethodnog izraza
Prethodni simbol čini ga doslovnim znakom
{…} Eksplicitan zapis kvantifikatora
(…) Logičko grupiranje dijela izraza

Zadana verzija zahvat ima samo ograničenu podršku za regularne izraze. Kako bi svi sljedeći primjeri funkcionirali, upotrijebite egrep umjesto ili grep -E .

Da biste pronašli retke pomoću | da odgovara bilo kojem izrazu:

$egrep‘Xxz|xzz ’moja datoteka

Za pronalaženje redaka pomoću | za podudaranje bilo kojeg izraza unutar niza također upotrijebite ():

$egrep‘^ X(Yz|yz)’Moja datoteka

Da biste pronašli retke pomoću [] za podudaranje s bilo kojim znakom:

$egrep‘^ X[YY]z ’myfile

Da biste pronašli retke pomoću [] koji NE odgovaraju nijednom znaku:

$egrep‘^ X[^ Yy]z ’myfile

Da biste pronašli retke pomoću * koji odgovaraju 0 ili više prethodnog izraza:

$egrep‘^Xy*z ’myfile

Da biste pronašli retke pomoću + koji odgovaraju 1 ili više prethodnih izraza:

$egrep‘^Xy+z’ moja datoteka

Da biste pronašli retke pomoću? da odgovara 0 ili 1 prethodnog izraza:

$egrep‘^Xy? Z’ moja datoteka

Vježba III

  1. Pronađi sve retke koji sadrže imena Evans ili slikar u datoteci ljudi.
  2. Pronađi sve retke koji sadrže imena Smith, Smyth ili Smythe u datoteci ljudi.
  3. Pronađi sve retke koji sadrže imena Brown, Browen ili Izvor u datoteci ljudi.Ako imate vremena:
  4. Pronađite redak koji sadrži niz (admin), uključujući zagrade, u datoteci ljudi.
  5. Pronađite redak koji sadrži znak * u datoteci ljudi.
  6. Kombinirajte gornje 5 i 6 da biste pronašli oba izraza.

Više primjera

Za pronalaženje redaka pomoću . i * da odgovara bilo kojem skupu znakova:

$egrep‘^Xy.*z ’myfile

Da biste pronašli retke pomoću {} za podudaranje s N brojem znakova:

$egrep‘^Xy{3}z ’myfile
$egrep‘^Xy{4}z ’myfile

Da biste pronašli retke pomoću {} za podudaranje s N ili više puta:

$egrep‘^Xy{3,}z ’myfile

Da biste pronašli retke pomoću {} za podudaranje s N puta, ali ne više od M puta:

$egrep‘^Xy{2,3}z ’myfile

Zaključak

U ovom smo vodiču prvo pogledali korištenje zahvat u jednostavnom obliku pronaći tekst u datoteci ili u više datoteka. Zatim smo kombinirali tekst za traženje s jednostavnim regularnim izrazima, a zatim pomoću složenijih egrep .

Sljedeći koraci

Nadam se da ćete ovdje stečeno znanje dobro iskoristiti. Probati zahvat naredbe na vlastitim podacima i zapamtite, regularni izrazi kako je ovdje opisano mogu se koristiti u istom obliku u mi , sed i awk !

Rješenja za vježbe

Vježba I.

Prvo izbrojite koliko redaka ima u datoteci /etc/passwd .
$ wc -l /etc/passwd
Sada pronađite sve pojave teksta gdje u datoteci /etc /passwd.
$ grep var /etc/passwd
Saznajte koliko redaka u datoteci sadrži tekst gdje

zahvat -cgdje/itd/passwd

Saznajte koliko redaka NE sadrži tekst gdje .

zahvat -cvgdje/itd/passwd

Pronađite unos za svoju prijavu u /etc/passwd datoteka
grep kdm /etc/passwd

Vježba II

Prikažite datoteku narod i ispitati njegov sadržaj.
$ cat people
Pronađite sve retke koji sadrže niz Smith u datoteci narod .
$ grep 'Smith' people
Izradite novu datoteku, nljudi , koji sadrži sve retke koji počinju nizom Osobni u narod datoteka
$ grep '^Personal' people> npeople
Potvrdite sadržaj datoteke nljudi uvrštavanjem datoteke.
$ cat npeople
Sada dodajte sve retke gdje tekst završava nizom 500 u datoteci narod u datoteku nljudi .
$ grep '500$' people>>npeople
Ponovno potvrdite sadržaj datoteke nljudi uvrštavanjem datoteke.
$ cat npeople
Pronađite IP adresu poslužitelja koja je pohranjena u datoteci /etc/hosts .
$ grep $(hostname) /etc/hosts
Koristiti egrep izdvojiti iz /etc/passwd linije računa računa datoteka koje sadrže lp ili svoj korisnički ID.
$ egrep '(lp|kdm:)' /etc/passwd

Vježba III

Pronađi sve retke koji sadrže imena Evans ili slikar u datoteci narod .
$ egrep 'Evans|Maler' people
Pronađi sve retke koji sadrže imena Smith , Smyth ili Smythe u datoteci narod .
$ egrep 'Sm(i|y)the?' people
Pronađi sve retke koji sadrže imena Smeđa , Browen ili Izvor u datoteci ljudi.
$ egrep 'Brow?e?n' people
Pronađite redak koji sadrži niz (admin), uključujući zagrade u datoteci narod .

$egrep ' (Administrator )'narod

Pronađite redak koji sadrži znak * u datoteci ljudi.
$ egrep '*' people
Kombinirajte gornje 5 i 6 da biste pronašli oba izraza.

$egrep ' (Administrator ) | *'narod