Uporaba grep (in egrep) z regularnimi izrazi

Using Grep With Regular Expressions



Ta vadnica opisuje, kako uporabljati oboje oprijem (in egrep) t o poiščite besedilo v datotekah v njihovi preprosti obliki in v kombinaciji z regularnimi izrazi. Vsebuje več primeri in vaje , več rešitve , da ga gledalec dokonča.

Ime oprijem izhaja iz ukaza ed (in vim) g/re/p, kar pomeni globalno iskanje določenega regularnega izraza in tiskanje (prikaz) izpisa.







Redno Izrazi

Pripomočki uporabniku omogočajo iskanje besedilnih datotek za vrstice, ki se ujemajo z regularnim izrazom ( regexp ). Regularni izraz je iskalni niz, sestavljen iz besedila in enega ali več od 11 posebnih znakov. Preprost primer je ujemanje začetka vrstice.



Vzorčna datoteka

Osnovna oblika oprijem lahko uporabite za iskanje preprostega besedila v določeni datoteki ali datotekah. Če želite preizkusiti primere, najprej ustvarite vzorčno datoteko.



Uporabite urejevalnik, kot sta nano ali vim, da spodnje besedilo kopirate v datoteko, imenovano myfile .





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

Čeprav lahko kopirate in prilepite primere v besedilo (upoštevajte, da se dvojni narekovaji morda ne kopirajo pravilno), je treba ukaze vnesti, da se jih lahko pravilno naučite.

Preden preizkusite primere, si oglejte vzorčno datoteko:



$mačkamyfile

Enostavno iskanje

Če želite poiskati besedilo 'xyz' v datoteki, zaženite naslednje:

$oprijemxyz myfile

Uporaba barv

Za prikaz barv uporabite –color (dvojni vezaj) ali preprosto ustvarite vzdevek. Na primer:

$oprijem -barvaxyz myfile

ali

$vzdevek oprijem= 'oprijem-barva '
$oprijemxyz myfile

Opcije

Skupne možnosti, ki se uporabljajo z oprijem ukaz vključuje:

  • -najdem vse vrstice ne glede na to primera
  • -c šteti koliko vrstic vsebuje besedilo
  • -n prikazovalna vrstica številke ujemajočih se vrstic
  • -samo zaslon mapa imena to tekmo
  • -r rekurzivno iskanje podimenikov
  • -v najdem vse vrstice NE ki vsebuje besedilo

Na primer:

$oprijem -jazxyz myfile# poišči besedilo ne glede na velike in male črke

$oprijem -icxyz myfile# štetje vrstic z besedilom

$oprijem -vxyz myfile# prikaži številke vrstic

Ustvarite več datotek

Preden iščete več datotek, najprej ustvarite več novih datotek:

$vrgel venxyz>myfile1
$vrgel ven -Inxyz nxzz nXYZ>myfile2
$vrgel ven -Inxxx nyyy>myfile3
$mačkamyfile1
$mačkamyfile2
$mačkamyfile3

Iščite po več datotekah

Če želite iskati več datotek z imeni datotek ali nadomestnim znakom, vnesite:

$oprijem -icxyz myfile myfile1 myfile2 myfile3
$oprijem -vxyz moj*
# imena datotek, ki se ujemajo z »moj«

Vaja I.

  1. Najprej preštejte, koliko vrstic je v datoteki /etc /passwd.
Namig: uporabitestranišče - /itd/passwd
  1. Zdaj poiščite vse pojavitve besedila kje v datoteki /etc /passwd .
  2. Poiščite, koliko vrstic v datoteki vsebuje besedilo
  3. Ugotovite, koliko vrstic NE vsebuje besedila kje .
  4. Poiščite vnos za prijavo v /etc/passwd

Rešitve vaj najdete na koncu tega članka.

Uporaba regularnih izrazov

Ukaz oprijem se lahko uporablja tudi z regularnimi izrazi z uporabo enega ali več od enajstih posebnih znakov ali simbolov za natančnejše iskanje. Regularni izraz je niz znakov, ki vključuje posebne znake, ki omogočajo ujemanje vzorcev znotraj pripomočkov, kot so oprijem , Sem prišel in sed . Upoštevajte, da je treba nize morda navesti v narekovajih.

Na voljo so posebni znaki:

^ Začetek vrstice
$ Konec vrstice
. Kateri koli znak (razen n nove vrstice)
* 0 ali več prejšnjega izraza
Pred simbolom postane dobesedni znak

Upoštevajte, da *, ki se lahko uporabi v ukazni vrstici za ujemanje s katerim koli številom znakov, vključno z nobenim, je ne se tukaj uporablja na enak način.

Upoštevajte tudi uporabo narekovajev v naslednjih primerih.

Primeri

Če želite poiskati vse vrstice, ki se začnejo z besedilom, z znakom ^:

$oprijem»^Xyz« moja datoteka

Če želite poiskati vse vrstice, ki se končajo z besedilom, z znakom $:

$oprijem»Xyz $« myfile

Če želite poiskati vrstice, ki vsebujejo niz z znaki ^ in $:

$oprijem'^Xyz $' myfile

Če želite poiskati vrstice z . se ujema s katerim koli likom:

$oprijem»^X.z« moja datoteka

Če želite poiskati vrstice z znakom * za 0 ali več prejšnjega izraza:

$oprijem‘^Xy*z ’myfile

Če želite poiskati vrstice z.* Za ujemanje 0 ali več katerega koli znaka:

$oprijem‘^ X.*z ’myfile

Če želite poiskati vrstice z za pobeg od znaka *:

$oprijem‘^ X *z ’myfile

Za iskanje znaka uporabite:

$oprijem'\' myfile

Izraz grep - egrep

The oprijem ukaz podpira le podmnožico regularnih izrazov, ki so na voljo. Vendar pa ukaz egrep:

  • omogoča polno uporabo vseh regularnih izrazov
  • lahko hkrati išče več kot en izraz

Upoštevajte, da morajo biti izrazi zaprti v par narekovajev.

Če želite uporabiti barve, uporabite –color ali znova ustvarite vzdevek:

$vzdevek egrep='egrep -barva'

Za iskanje več kot enega regex the egrep ukaz je lahko zapisan v več vrsticah. To pa lahko storite tudi s temi posebnimi znaki:

| Izmenjava, bodisi ena ali druga
(…) Logično združevanje dela izraza
$egrep '(^root |^uucp |^mail)' /itd/passwd

Tako izvlečete vrstice, ki se začnejo z root, uucp ali mail iz datoteke, | simbol, ki pomeni eno od možnosti.

Naslednji ukaz bo ne delo, čeprav ni prikazano nobeno sporočilo, saj je osnovni oprijem ukaz ne podpira vseh regularnih izrazov:

$oprijem '(^root |^uucp |^mail)' /itd/passwd

Vendar pa je v večini sistemov Linux ukaz grep -E je enako kot pri uporabi egrep :

$oprijem -IN '(^root |^uucp |^mail)' /itd/passwd

Uporaba filtrov

Cevovodi je postopek pošiljanja izida enega ukaza kot vhod v drug ukaz in je eno najmočnejših razpoložljivih orodij Linuxa.

Ukazi, ki se pojavijo v cevovodu, se pogosto imenujejo filtri, saj v mnogih primerih presejejo ali spremenijo vhod, ki jim je bil poslan, preden pošljejo spremenjeni tok na standardni izhod.

V naslednjem primeru standardni izhod iz ls -l se posreduje kot standardni vhod v oprijem ukaz. Izhod iz oprijem ukaz se nato posreduje kot vhod v več ukaz.

To bo prikazalo samo imenike v /itd :

$ls - /itd|oprijem'^D'|več

Naslednji ukazi so primeri uporabe filtrov:

$ps -ef|oprijemcron

$WHO|oprijemkdm

Vzorčna datoteka

Če želite preizkusiti vajo pregleda, najprej ustvarite naslednjo vzorčno datoteko.

Uporabite urejevalnik, kot sta nano ali vim, da spodnje besedilo kopirate v datoteko, imenovano ljudje:

Osebni J.Smith 25000
Osebni E.Smith 25400
Usposabljanje A. Brown 27500
Usposabljanje C.Browen 23400
(Admin) R.Bron 30500
Goodsout T.Smyth 30000
Osebni F.Jones 25000
usposabljanje* C.Evans 25500
Goodsout W.Pope 30400
Pritličje T.Smythe 30500
Osebni J.Maler 33000

Vaja II

  1. Prikažite datoteko ljudi in preuči njeno vsebino.
  2. Poiščite vse vrstice, ki vsebujejo niz Smith v datoteki ljudje. Namig: uporabite ukaz grep, vendar ne pozabite, da privzeto razlikuje velike in male črke.
  3. Ustvarite novo datoteko npeople, ki vsebuje vse vrstice, ki se začnejo z nizom Osebno v datoteki oseb. Namig: uporabite ukaz grep z>.
  4. Vsebino datoteke potrdite s seznamom datoteke.
  5. Zdaj dodajte vse vrstice, kjer se besedilo konča z nizom 500 v datoteki ljudje v datoteko npeople.Namig: uporabite ukaz grep s >>.
  6. Ponovno potrdite vsebino datoteke npeople tako, da navedete datoteko.
  7. Poiščite naslov IP strežnika, ki je shranjen v datoteki /etc/hosts .Namig: uporabite ukaz grep z $ (ime gostitelja)
  8. Uporaba egrep izvleči iz /etc/passwd vrstice računov datotek, ki vsebujejo lp ali svoje Uporabniško ime .

Rešitve vaj najdete na koncu tega članka.

Več regularnih izrazov

Redni izraz si lahko predstavljamo kot nadomestne znake na steroidih.

Obstaja enajst znakov s posebnim pomenom: začetni in zaključni oglati oklepaj [], poševnica , kareta ^, znak dolarja $, pika ali pika., Navpična črta ali simbol cevi |, vprašaj?, zvezdica ali zvezdica *, znak plus + ter oklepaj za odpiranje in zapiranje {}. Te posebne znake pogosto imenujemo tudi metaznaki.

Tu je celoten nabor posebnih znakov:

^ Začetek vrstice
$ Konec vrstice
. Kateri koli znak (razen n nove vrstice)
* 0 ali več prejšnjega izraza
| Izmenjava, bodisi ena ali druga
[…] Eksplicitni nabor znakov za ujemanje
+ 1 ali več prejšnjih izrazov
? 0 ali 1 prejšnjega izraza
Pred simbolom postane dobesedni znak
{…} Eksplicitni zapis kvantifikatorja
(…) Logično združevanje dela izraza

Privzeta različica oprijem ima le omejeno podporo za regularne izraze. Če želite, da vsi naslednji primeri delujejo, uporabite egrep namesto oz grep -E .

Če želite poiskati vrstice z | da se ujema z enim ali drugim izrazom:

$egrep'Xxz|xzz 'myfile

Za iskanje vrstic z uporabo | za ujemanje katerega koli izraza v nizu uporabite tudi ():

$egrep‘^ X(Yz|yz)'Myfile

Če želite poiskati vrstice s tipko [] za ujemanje katerega koli znaka:

$egrep‘^ X[Yy]z ’myfile

Če želite poiskati vrstice s tipko [], da se NE ujemajo z nobenim znakom:

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

Če želite poiskati vrstice z znakom * za 0 ali več prejšnjega izraza:

$egrep‘^Xy*z ’myfile

Če želite poiskati vrstice z znakom + za ujemanje 1 ali več prejšnjega izraza:

$egrep‘^Xy+z’ myfile

Če želite poiskati vrstice z? da se ujema z 0 ali 1 prejšnjega izraza:

$egrep'^Xy? Z' myfile

Vaja III

  1. Poiščite vse vrstice z imeni Evans ali slikar v datoteki ljudje.
  2. Poiščite vse vrstice z imeni Smith, Smyth ali Smythe v datoteki ljudje.
  3. Poiščite vse vrstice z imeni Brown, Browen ali Vir v datoteki ljudje. Če imate čas:
  4. Poiščite vrstico, ki vsebuje niz (administrator), vključno z oklepaji, v datoteki ljudje.
  5. Poiščite vrstico, ki vsebuje znak * v datoteki ljudje.
  6. Združite zgornji 5 in 6, da poiščete oba izraza.

Več primerov

Za iskanje vrstic z uporabo . in * za ujemanje s katerim koli nizom znakov:

$egrep‘^Xy.*z ’myfile

Če želite poiskati vrstice z {} za ujemanje s številom N znakov:

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

Če želite poiskati vrstice z {} za ujemanje N ali večkrat:

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

Če želite poiskati vrstice z {} za ujemanje N -krat, vendar ne več kot M -krat:

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

Zaključek

V tej vadnici smo najprej pogledali uporabo oprijem v enostavni obliki najdete besedilo v datoteki ali v več datotekah. Besedilo, ki ga iščemo, smo nato združili s preprostimi regularnimi izrazi in nato z uporabo bolj zapletenih egrep .

Naslednji koraki

Upam, da boste tukaj pridobljeno znanje dobro uporabili. Poskusi oprijem ukaze na lastne podatke in zapomnite si, da lahko regularne izraze, opisane tukaj, uporabite v isti obliki v mi , sed in awk !

Rešitve za vadbo

Vaja I.

Najprej preštejte, koliko vrstic je v datoteki /etc/passwd .
$ wc -l /etc/passwd
Zdaj poiščite vse pojavitve besedila kje v datoteki /etc /passwd.
$ grep var /etc/passwd
Poiščite, koliko vrstic v datoteki vsebuje besedilo kje

oprijem -ckje/itd/passwd

Ugotovite, koliko vrstic NE vsebuje besedila kje .

oprijem -cvkje/itd/passwd

Poiščite vnos za prijavo v /etc/passwd mapa
grep kdm /etc/passwd

Vaja II

Prikažite datoteko ljudi in preuči njeno vsebino.
$ cat people
Poiščite vse vrstice, ki vsebujejo niz Smith v datoteki ljudi .
$ grep 'Smith' people
Ustvarite novo datoteko, n ljudi , ki vsebuje vse vrstice, ki se začnejo z nizom Osebno v ljudi mapa
$ grep '^Personal' people> npeople
Potrdite vsebino datoteke n ljudi z navedbo datoteke.
$ cat npeople
Zdaj dodajte vse vrstice, kjer se besedilo konča z nizom 500 v datoteki ljudi v datoteko n ljudi .
$ grep '500$' people>>npeople
Še enkrat potrdite vsebino datoteke n ljudi z navedbo datoteke.
$ cat npeople
Poiščite naslov IP strežnika, ki je shranjen v datoteki /etc/hosts .
$ grep $(hostname) /etc/hosts
Uporaba egrep izvleči iz /etc/passwd vrstice računov datotek, ki vsebujejo lp ali svoj uporabniški ID.
$ egrep '(lp|kdm:)' /etc/passwd

Vaja III

Poiščite vse vrstice z imeni Evans ali slikar v datoteki ljudi .
$ egrep 'Evans|Maler' people
Poiščite vse vrstice z imeni Smith , Smyth ali Smythe v datoteki ljudi .
$ egrep 'Sm(i|y)the?' people
Poiščite vse vrstice z imeni rjav , Browne ali Vir v datoteki ljudje.
$ egrep 'Brow?e?n' people
Poiščite vrstico, ki vsebuje niz (administrator), vključno z oklepaji v datoteki ljudi .

$egrep ' (Skrbnik )'ljudi

Poiščite vrstico, ki vsebuje znak * v datoteki ljudje.
$ egrep '*' people
Združite zgornji 5 in 6, da poiščete oba izraza.

$egrep ' (Skrbnik ) | *'ljudi