Kako koristiti Awk i regularne izraze za filtriranje teksta ili niza u datotekama


Kada pokrenemo određene komande u Unixu/Linuxu za čitanje ili uređivanje teksta iz stringa ili datoteke, najčešće pokušavamo da filtriramo izlaz u datom odeljku od interesa. Ovdje je korisna upotreba regularnih izraza.

Pročitajte također: 10 korisnih Linux lančanih operatera s praktičnim primjerima

Šta su regularni izrazi?

Regularni izraz se može definirati kao nizovi koji predstavljaju nekoliko nizova znakova. Jedna od najvažnijih stvari u vezi sa regularnim izrazima je da vam omogućavaju filtriranje izlaza naredbe ili datoteke, uređivanje dijela teksta ili konfiguracijske datoteke i tako dalje.

Karakteristike regularnog izraza

Regularni izrazi se sastoje od:

  1. Obični znakovi kao što su razmak, donja crta(_), A-Z, a-z, 0-9.
  2. Meta znakovi koji su prošireni na obične znakove, oni uključuju:

    1. (.) odgovara bilo kojem pojedinačnom znaku osim novog reda.
    2. (*) odgovara nula ili više postojanja neposrednog znaka koji mu prethodi.
    3. [ karakter(i) ] podudara se sa bilo kojim od znakova navedenih u znaku(ovima), također se može koristiti crtica (-) za označavanje raspona znakova kao što je kao [a-f], [1-5], i tako dalje.
    4. ^ odgovara početku reda u datoteci.
    5. $ odgovara kraju reda u datoteci.
    6. \ to je izlazni znak.

Da biste filtrirali tekst, potrebno je koristiti alat za filtriranje teksta kao što je awk. Možete zamisliti awk kao sopstveni programski jezik. Ali za opseg ovog vodiča za korištenje awk, pokriti ćemo ga kao jednostavan alat za filtriranje komandne linije.

Opća sintaksa awk-a je:

awk 'script' filename

Gdje je 'script' skup naredbi koje razumije awk i koje se izvršavaju u datoteci, naziv datoteke.

Radi tako što čita datu liniju u datoteci, pravi kopiju linije i zatim izvršava skriptu na liniji. Ovo se ponavlja na svim redovima u datoteci.

'script' je u obliku '/pattern/ action' gdje je uzorak regularni izraz, a akcija je ono što će awk učiniti kada pronađe dati obrazac u liniji.

Kako koristiti alat za filtriranje Awk u Linuxu

U sljedećim primjerima fokusirat ćemo se na meta znakove o kojima smo gore raspravljali pod karakteristikama awk-a.

Jednostavan primjer korištenja awk-a:

Primjer ispod ispisuje sve redove u datoteci /etc/hosts jer nije dat obrazac.

awk '//{print}'/etc/hosts

Koristite Awk sa uzorkom:

U primjeru ispod, dat je obrazac localhost, tako da će awk odgovarati liniji koja ima localhost u datoteci /etc/hosts.

awk '/localhost/{print}' /etc/hosts 

Korištenje Awk-a sa (.) džoker kartom u uzorku

(.) će odgovarati nizovima koji sadrže loc, localhost, localnet u primjeru ispod.

To će reći * l neki_pojedinačni_znak c *.

awk '/l.c/{print}' /etc/hosts

Korištenje Awk sa (*) znakom u uzorku

On će se podudarati sa nizovima koji sadrže localhost, localnet, lines, capable, kao u primjeru ispod:

awk '/l*c/{print}' /etc/localhost

Također ćete shvatiti da (*) pokušava pronaći najduže moguće podudaranje koje može otkriti.

Pogledajmo slučaj koji to demonstrira, uzmimo regularni izraz t*t što znači podudaranje nizova koji počinju slovom t i završavaju sa t u redu ispod:

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint. 

Dobićete sljedeće mogućnosti kada koristite obrazac /t*t/:

this is t
this is tecmint
this is tecmint, where you get t
this is tecmint, where you get the best good t
this is tecmint, where you get the best good tutorials, how t
this is tecmint, where you get the best good tutorials, how tos, guides, t
this is tecmint, where you get the best good tutorials, how tos, guides, tecmint

I (*) u /t*t/ džoker znak dozvoljava awk-u da odabere posljednju opciju:

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint

Korištenje Awk sa skupom [ znakova]

Uzmimo za primjer skup [al1], ovdje će awk odgovarati svim nizovima koji sadrže karakter a ili l ili 1 u redu u datoteci /etc/hosts.

awk '/[al1]/{print}' /etc/hosts

Sljedeći primjer odgovara nizovima koji počinju sa K ili k nakon čega slijedi T:

awk '/[Kk]T/{print}' /etc/hosts 

Određivanje znakova u rasponu

Razumjeti znakove sa awk:

  1. [0-9] znači jedan broj
  2. [a-z] znači podudaranje s jednim malim slovom
  3. [A-Z] znači podudaranje s jednim velikim slovom
  4. [a-zA-Z] znači podudaranje s jednim slovom
  5. [a-zA-Z 0-9] znači podudaranje s jednim slovom ili brojem

Pogledajmo primjer u nastavku:

awk '/[0-9]/{print}' /etc/hosts 

Svi redovi iz datoteke /etc/hosts sadrže barem jedan broj [0-9] u gornjem primjeru.

Koristite Awk sa (^) meta karakterom

Poklapa se sa svim linijama koje počinju sa datim uzorkom kao u primjeru ispod:

awk '/^fe/{print}' /etc/hosts
awk '/^ff/{print}' /etc/hosts

Koristite Awk sa ($) meta karakterom

Poklapa se sa svim linijama koje završavaju datim uzorkom:

awk '/ab$/{print}' /etc/hosts
awk '/ost$/{print}' /etc/hosts
awk '/rs$/{print}' /etc/hosts

Koristite Awk sa (\) Escape znakom

Omogućava vam da lik koji ga slijedi shvatite kao doslovni, što znači da ga smatrate takvim kakav jeste.

U primjeru ispod, prva naredba ispisuje sve redove u datoteci, druga naredba ne ispisuje ništa jer želim upariti red koji ima $25,00, ali se ne koristi escape znak.

Treća naredba je ispravna jer je escape karakter korišten za čitanje $ onako kako jeste.

awk '//{print}' deals.txt
awk '/$25.00/{print}' deals.txt
awk '/\$25.00/{print}' deals.txt

Sažetak

To nije sve sa awk alatom za filtriranje komandne linije, primjeri iznad osnovnih operacija awk-a. U narednim dijelovima ćemo govoriti o tome kako koristiti složene karakteristike awk-a. Hvala na čitanju i za bilo kakve dodatke ili pojašnjenja, ostavite komentar u odjeljku za komentare.