Kada pokrećemo određene naredbe u Unixu/Linuxu za čitanje ili uređivanje teksta iz niza ili datoteke, najčešće pokušavamo filtrirati izlaz u dati odjeljak od interesa. Ovdje upotreba regularnih izraza dobro dođe.
Pročitajte i:10 korisnih operatora za povezivanje Linuxa s praktičnim primjerima
Regularni izraz može se definirati kao nizovi koji predstavljaju nekoliko nizova znakova. Jedna od najvažnijih stvari o regularnim izrazima je ta što vam omogućuju filtriranje izlaza naredbe ili datoteke, uređivanje dijela tekstualne ili konfiguracijske datoteke itd.
Regularni izrazi se sastoje od:
(.)
odgovara bilo kojem pojedinačnom znaku osim novog retka.(*)
podudara se s nulom ili više postojanja neposrednog znaka koji mu prethodi.[znakovi (i)]
podudara se s bilo kojim od znakova navedenih u znakovima, može se koristiti i crtica (-)
znači niz znakova kao što su [a-f]
, [1-5]
, i tako dalje.^
podudara se s početkom retka u datoteci.$
odgovara kraju retka u datoteci.\
to je lik za bijeg.Da biste filtrirali tekst, morate koristiti alat za filtriranje teksta, npr awk. Možete smisliti awk kao programski jezik. No, za opseg ovog vodiča za korištenje awk, pokazat ćemo ga kao jednostavan alat za filtriranje naredbenog retka.
Opća sintaksa awka je:
# awk 'script' naziv datoteke.
Gdje "skripta"
je skup naredbi koje razumije awk i izvršavaju se na datoteci, naziv datoteke.
Radi tako što čita datoteku u retku, pravi kopiju retka i zatim izvršava skriptu na retku. To se ponavlja u svim recima u datoteci.
The "skripta"
je u obliku '/ pattern/ action'
gdje uzorak je regularni izraz i akcijski je ono što će awk učiniti kada pronađe dani uzorak u retku.
U sljedećim primjerima usredotočit ćemo se na meta likove o kojima smo gore govorili pod značajkama awka.
Primjer ispod ispisuje sve retke u datoteci /etc/hosts budući da se ne daje obrazac.
# awk '//{print} '/etc/hosts.
I primjer u nastavku, uzorak localhost
je dano, pa će awk odgovarati linijskom imanju localhost u /etc/hosts
datoteka.
# awk '/localhost/{print} ' /etc /hosts
The (.)
odgovarat će nizovima koji sadrže loc, localhost, localnet u donjem primjeru.
To će reći * l neki_jedan_slog c *.
# awk '/l.c/{print} ' /etc /hosts.
On će se podudarati sa nizovima koji sadrže localhost, localnet, linije, sposoban, kao u donjem primjeru:
# awk '/l*c/{print} ' /etc /localhost.
To ćete i shvatiti (*)
pokušava vam osigurati najduže moguće podudaranje koje može otkriti.
Pogledajmo slučaj koji to pokazuje, uzmimo regularni izraz t*t
što znači nizovi podudaranja koji počinju slovom t
i završiti s t
u donjem retku:
ovo je tecmint, gdje dobivate najbolje dobre vodiče, upute, tecmint.
Kad koristite uzorak, dobit ćete sljedeće mogućnosti /t*t/
:
ovo je t. ovo je tecmint. ovo je tecmint, gdje dobivate t. ovo je tecmint, gdje dobivate najbolje dobre t. ovo je tecmint, gdje dobivate najbolje dobre vodiče, kako t. ovo je tecmint, gdje dobivate najbolje dobre vodiče, kako tos, vodiče, t. ovo je tecmint, gdje dobivate najbolje dobre vodiče, kako tos, vodiče, tecmint.
I (*)
u /t*t/
zamjenski znak dopušta awku odabir posljednje opcije:
ovo je tecmint, gdje dobivate najbolje dobre vodiče, upute, tecmint.
Uzmimo za primjer set [al1]
, ovdje će awk odgovarati svim nizovima koji sadrže znak a
ili l
ili 1
u retku u datoteci /etc/hosts.
# awk '/[al1]/{print} ' /etc /hosts.
Sljedeći primjer podudara nizove koji počinju s bilo kojim K
ili k
slijedi T
:
# awk '/[Kk]T/{print} ' /etc /hosts
Shvatite znakove pomoću awka:
[0-9]
znači jedan broj[a-z]
znači podudaranje s jednim malim slovom[A-Z]
znači podudaranje s jednim velikim slovom[a-zA-Z]
znači podudaranje s jednim slovom[a-zA-Z 0-9]
znači podudaranje s jednim slovom ili brojemPogledajmo primjer ispod:
# awk '/[0-9]/{print} ' /etc /hosts
Sav redak iz datoteke /etc/hosts sadrže barem jedan broj [0-9]
u gornjem primjeru.
Podudara se sa svim linijama koje počinju s ponuđenim uzorkom kao u donjem primjeru:
# awk '/^fe/{print} ' /etc /hosts. # awk '/^ff/{print} ' /etc /hosts.
Podudara se sa svim linijama koje završavaju ponuđenim uzorkom:
# awk '/ab$/{print} ' /etc /hosts. # awk '/ost$/{print} ' /etc /hosts. # awk '/rs$/{print} ' /etc /hosts.
Omogućuje vam da uzmete znak koji ga slijedi kao doslovnu, što znači da ga smatrate takvim kakav jest.
U donjem primjeru prva naredba ispisuje cijeli redak u datoteci, druga naredba ne ispisuje ništa jer želim podudarati redak koji ima $25.00, ali se ne koristi znak za bijeg.
Treća naredba je točna jer se za čitanje koristio escape znak $ takvo kakvo jest.
# awk '//{print} 'offers.txt. # awk '/$25.00/{print} 'offers.txt. # awk '/\$25.00/{print} 'offers.txt.
To nije sve sa awk alat za filtriranje naredbenog retka, gornji primjeri a osnovne operacije awka. U sljedećim ćemo dijelovima napredovati u korištenju složenih značajki awka. Hvala vam na čitanju i na bilo kakvim dodacima ili pojašnjenjima, objavite komentar u odjeljku komentara.