Na Linuxu, awk predstavlja izvanredan alat za obradu teksta putem komandne linije, a istovremeno je i moćan skriptni jezik. Predstavljamo vam uvod u neke od njegovih ključnih funkcionalnosti.
Poreklo imena awk
Naziv komande awk izveden je iz inicijala tri autora koji su kreirali originalnu verziju 1977. godine: Alfred Aho, Peter Weinberger i Brian Kernighan. Ova trojica stručnjaka potiču iz čuvenih AT&T Bell Laboratories, prave institucije u svetu Unixa. Uz doprinose mnogih drugih tokom godina, awk se nastavio razvijati.
On nije samo kompletan alat za obradu teksta u komandnoj liniji, već i punopravni skriptni jezik. Ukoliko vas ovaj tekst motiviše, detaljno istražite sve mogućnosti awk-a i njegovu funkcionalnost.
Pravila, obrasci i radnje
Awk funkcioniše koristeći programe koji se sastoje od pravila formiranih od obrazaca i radnji. Radnja se izvršava nad tekstom koji odgovara obrascu. Obrasci su zatvoreni unutar vitičastih zagrada ({}). Obrazac i radnja zajedno čine pravilo. Celokupan awk program se stavlja unutar jednostrukih navodnika (‘).
Pogledajmo najjednostavniju vrstu awk programa. On nema obrazac, pa samim tim odgovara svakom redu teksta koji mu se prosledi. To znači da se radnja primenjuje na svakom redu. Na primer, može se primeniti na izlaz komande who
.
Evo standardnog izlaza komande who
:
who
Možda nam nisu potrebne sve prikazane informacije, već samo imena korisnika. Izlaz komande who
možemo proslediti komandi awk
i zatražiti od nje da prikaže samo prvo polje.
Po defaultu, awk smatra da je polje niz znakova okružen razmakom, početkom reda ili krajem reda. Polja se identifikuju pomoću znaka dolara ($) i broja. Dakle, $1 predstavlja prvo polje, koje ćemo iskoristiti sa radnjom `print` kako bismo prikazali prvo polje.
Unosimo sledeće:
who | awk '{print $1}'
Awk štampa prvo polje, a ostatak reda ignoriše.
Možemo prikazati onoliko polja koliko želimo. Dodavanjem zareza kao separatora, awk će štampati razmak između svakog polja.
Da bismo prikazali i vreme prijavljivanja korisnika (četvrto polje), unosimo sledeće:
who | awk '{print $1,$4}'
Postoji nekoliko specijalnih identifikatora polja. Oni predstavljaju ceo red teksta i poslednje polje u redu:
$0: Predstavlja ceo red teksta.
$1: Predstavlja prvo polje.
$2: Predstavlja drugo polje.
$7: Predstavlja sedmo polje.
$45: Predstavlja 45. polje.
$NF: Označava „broj polja“ i predstavlja poslednje polje.
Prikažimo sadržaj tekstualnog fajla koji sadrži kratak citat pripisan Dennis Ritchie-u:
cat dennis_ritchie.txt
Želimo da awk ispiše prvo, drugo i poslednje polje citata. Imajte na umu da, iako je citat prelomljen u prozoru terminala, radi se o jednom redu teksta.
Unosimo sledeću komandu:
awk '{print $1,$2,$NF}' dennis_ritchie.txt
Ne znamo koji je broj „jednostavnost“. To je 18. polje u redu teksta i to nas ne zanima. Ono što znamo jeste da je to poslednje polje i možemo koristiti $NF da dobijemo njegovu vrednost. Tačka se tretira samo kao još jedan karakter u tekstu.