3. Ciljevi teaja
upoznati se sa awk
jezikom i alatima
osposobiti se za
samostalni rad sa awk
jezikom
S92 / 3
4. Podruja
Pregled awk jezika
Primjeri kori邸tenja awk jezika
S92 / 4
5. Potrebno predznanje
Korisniki rad sa UNIX-om
Poznavanje shell-a
Poznavanje UNIX-a utilities
S92 / 5
6. 皆温糸姻転温逮
Dan 1
Uvod 15 min
Upoznavanje awk-a 30 min
Pauza
Upoznavanje awk-a 45 min
Pauza
Upoznavanje awk-a 45 min
Pauza
Upoznavanje awk-a 45 min
Ruak
Primjeri awk koda 90 min
S92 / 6
7. to neete nauiti na teaju
Puno toga!
Neete dobiti gotove
recepte za sve va邸e
probleme
S92 / 7
8. Izvori
Awk & Sed, OReilly & Associates, inc.
SunOS dokumentacija
OSF1 dokumentacija,
S92 / 8
9. Uvod
awk
promjena podataka
jezik za generiranje izvje邸taja
jezik za pisanje interpretiranih filter program
S92 / 9
10. awk - opis
SINOPSIS
awk [-F string][-f prog][-v var=value][program]var=value][file]
OPIS
awk je jezik za obradu datoteka, podesan za manipuliranje i dohvat
podataka iz ASCII datoteka.
Datoteke navedene u komadnoj liniji se koriste kao ulazni podaci za
awk, inae awk ita podatke sa standardnog ulaza (konvencija filter
programa)
S92 / 10
11. awk program
awk program se sastoji iz proizvoljnog broja
definiranih funkcija i pravila oblika:
pattern {action}
Prije izvoenja programa kod se prevodi !
S92 / 11
12. awk program
ulazni podaci
Begin { akcija }
$0, $1, $2 ... $NF linija teksta
uzorak1{ akcija }
uzorak2 { akcija } ispis rezultata
END { akcija }
S92 / 12
13. Pokretanje awk programa
Postoje dva naina pokretanja awk programa
Sa komandne linije
program zadan kao komanda ljuske, obino u zatvorena
u apostrofe ('), da bi se izbjegla ekspanzija
parametara
awk { print $2 }
Kori邸tenjem -f prog opcije awk-a
awk -f prog1.awk
S92 / 13
14. awk opcije
-F string
definira string kao separator polja
-f prog
ako ima vi邸e -f opcija u komandnoj liniji svi programi
se spajaju u jedan prije izvoenja
-v var=value
dodjeljuje varijabli var vrijednost var prije izvoenja
programa.
awk -v v1=10 -f prog datafile
S92 / 14
15. Inicijalizacija varijabli sa
komandne linije
var=value
awk -f progfile a=1 f1 f2 a=2 f3
postavlja a na 1 prije itanja iz datoteka f1 i f2, te postavlja a na 2
prije itanja iz datoteke f3
Inicijalizacija varijabli navedenih prije prove datoteke u
komadnoj liniji dogaa se odmah nakon izvoenja BEGIN
pravila u programu.
Inicijalizacija varijabli navedenih poslije zadnje datoteke u
komadnoj liniji dogaa se prije izvoenja END pravila u
programu.
S92 / 15
16. Varijable
Tipovi varijabli u awk-u:
identifikatori
Identifikator je niz slova i brojeva te _, a ne smiju poeti sa
brojem
polja elemenata
Polja su asocijativna polja oblika
identifier[subscript]=value
awk varijable ne treba ni deklarirati ni inicijalizirati. Vrijednost se
automatski postavlja na (prazni string)
S92 / 16
17. Izrazi
Izrazi u awk se sastoje iz:
konstatni, varijabli, funkcija,
regularnih izraza,
`subscript in array' uslova
vezanih operatorima.
Varijable i izrazi imaju string vrijednost i numeriku
vrijednost, kontekst odluuje sto se koristi
S92 / 17
18. String konstante posebnog
znaenja
a au d ib le b ell
b b ack sp ace
f fo rm feed
n n ew lin e
r carriage retu rn
t h o rizo n tal tab
v v ertical tab
o o o o ctal v alu e o o o
xdd h ex ad ecim al v alu e d d
" q u o te
c an y o th er ch aracter c
S92 / 18
19. Konstante
Brojane konstante su niz dekadskih znamenki
a=123.5
String konstante su navedene u navodnicima
a=ima i nema 12.3
S92 / 19
20. Symbol Table
Symbol table se mo転e dohvatiti kroz ugraeno polje SYMTAB.
SYMTAB[expr]
je isto 邸to i varijabla ije ime daje expr
SYMTAB["var"]
je sinonim za varijablu var.
S92 / 20
21. Environment
awk program mo転e dosei environment pomou ENVIRON polja
ENVIRON[name] = value
Primjer: Ispis je isti kao i za komadu env(1):
BEGIN {
for (i in ENVIRON)
printf("%s=%sn", i,ENVIRON[i])
exit
}
S92 / 21
22. Ugraene varijable
ARGV i ARGC
ARGV polje sadr転i argumente komandne linije
ARGC broj argumenata komandne linije
S92 / 22
23. Operatori
awk koristi standardnu hijerarhiju matematikih
operatora
ako dva izraza nisu odvojena operatorom, awk ih
povezuje kao jedan string.
a1 b2 a1b2
S92 / 23
24. Uvjetno izvoenje
uvjetni operator
expr ? expr1 : expr2
vraa expr1 ako je expr istina, inae vraa expr2
istina je sve razliito od 0 ili
S92 / 24
25. Posebni operatori
regularni izrazi
`~' daje 1 ako regularni izraz na lijevoj strani
odgovara desnoj strani
`!~' daje 1 ako regularni izraz na lijevoj strani ne
odgovara desnoj strani
$2 ~ /[0-9]/
selektira sve linije u kojima drugo polje sadr転i bar jednu
znamenku
S92 / 25
26. Pridru転enje vrijednosti
varijabli
varijabla var poprima vrijednost izraza expr
var = expr
var op= expr je isto 邸to i var = var op expr
a=b+0 forsira numeriko izraunavanje
a=a+0 forsira a kao broj
s=s forsira s kao string
S92 / 26
27. Hijerarhija operatora
V[a] operacija sa poljima
V++ V-- ++V --V increment, decrement
A^B eksponent
A -A !A unary plus,unary minus,logiki NOT
A*B A/B A%B mno転enje, dijelenje, ostatak
A+B A-B zbrajanje, oduzimanje
AB spajanje stringova
A<B A>B A<=B
A>=BA!=B A==B usporeivanje
A~B A!~B regularni izrazi
A in V pripadnost polju
A && B logiki AND
A || B logiki ILI
A ? B : C uslovno izvoenje
V=B V+=B V-=B aritmetike operacije
S92 / 27
28. Ulaz - (input)
awk dijeli ulaz (input) u zapise ili linije (records)
RS daje trenutni znak odjeljiva zapisa (record separator character)
RS=n
awk dijeli zapise u rijei $1 ..... $N
$i je i-ta rije u tekuem zapisu
$0 je cijeli zapis, tekua linija ulaza
FS daje tekue znakove za odjeljivanje rijei u liniji
FS = "[,:$]"
zarez,dvotoka,$ su separatori za rijei u liniji
S92 / 28
29. Ulaz - dodatne varijable
NF daje broj rijei u tekuoj liniji
NR daje broj linja proitanih do sada
FILENAME daje ime datoteke iz koje se ita tekui zapis
FNR daje broj linja proitanih do sada iz tekue datoteke
S92 / 29
30. getline
getline ita vrijednost $0 iz:
tekueg ulaza,
datoteke,
ili pipe.
Rezultat getline je broj
0 uspjeh,
1 end-of-file,
-1 gre邸ka
S92 / 30
31. Format getline
getline
ita liniju i pode邸ava sve varijable ($i,NF, NR,FNR)
getline var
ita liniju i stavlja je u var, ne dijeli je u $i, ali pode邸ava NR i FNR
getline <expr
ita liniju iz datoteke ije je ime expr, pode邸ava varijable $i,NF
getline var <expr
ita liniju iz datoteke ije je ime expr u varijablu var, ne dijeli je u $i
S92 / 31
32. getline i pipes
expr | getline
ita linije iz pipea koji nastaje izvoenjem expr, radi kao getline <expr.
expr | getline var
ita linije iz pipea koji nastaje izvoenjem expr,
radi kao getline var <expr
Datoteke i pipeovi se zatvaraju sa komandom close
close(expr)
S92 / 32
34. Ugraene string funkcije
Ako se ispuste argumenti koristi SE $0, i FS varijabla
len = length(expr)
n = split(string, array, regexp)
str = substr(string, offset, len)
pos = index(string, str)
pos = match(string, regexp)
n = sub(regexp, repl, string)
n = gsub(regexp, repl, string)
str = sprintf(fmt, expr, expr...)
n = ord(expr)
str = tolower(expr)
str = toupper(expr)
S92 / 34
35. Funkcija system
system funkcija izvodi vanjsku komandu expr i vraa rezultat
status = system(expr)
system("tail " $1)
S92 / 35
36. Korisniki definirane funkcije
function name(parameter-list) {
statements
}
Definicija funkcije mo転e biti bilo gdje u tijelu programa
Lista parametara se sastoji iz varijabli odvojenih zarezom, to su ujedno
i lokalne varijable za funkciju.
Sve ostale varijable navedene u funkciji su globalne
Skalarni argumenti se prenose po vrijednosti, a polja po referenci
Funkcija se vraa na return komandu ili nakon izvoenja svoje zadnje
komande
S92 / 36
37. Uzorci i akcije
( patterns & actions)
uzorak {
komanda; komanda
komanda
}
uzorak (pattern) je regularni izraz, poseban pattern, raspon ili
aritmetiki izraz
akcija je niz komandi koje zavr邸avaju sa ; n }
ako je uzorak ispu邸ten, linija se uvijek izvodi!
S92 / 37
38. Posebni uzorci
BEGIN
definira akcije koje se izvode prije itanja ulaznih podataka
END
definira akcije koje se izvode poslije itanja ulaznih podataka
pattern1,pattern2
raspon uzoraka (pattern range), hvata sve linije koje zadovoljavaju
uzorke od pattern1 do pattern2 ukljuivo
S92 / 38
39. IF - THEN - ELSE
# if statement AKO TADA INAE
if (condition){
statement
} else {
statement
}
S92 / 39
40. Komentar
# znak u liniji, komentar je sve do kraja linije
komanda ;# za komentar u istoj liniji sa komandama
S92 / 40
44. for za asocijativna polja
# for
for (i in polje) {
komanda
}
awk izvodi komandu za svaki element polja, i sadr転i novi indeks
ako je polje vi邸edimenzionalno i je dan kao jedan string,
znak definiran u SUBSEP se mo転e koristiti za odjeljivanje podindeksa
za vi邸edimenzionalna polja
S92 / 44
45. for
# for petlja, klasina c for petlja
for (expr1; cond; expr2) {
statement
}
expr1 poetno stanje brojaa u petlji
cond petlja radi dok je cond istina
expr2 uveavanje brojaa
S92 / 45
46. Komande za kontrolu petlji
break
prekida while petlju
continue
prekida tekuu iteraciju petlje i poinje novu
next
prekida oradu tekue ulazne linije i odmah nastavlja sa procesiranjem
nove ulazne linije
S92 / 46
47. exit
exit [(expr)]
prelazi na END uzorak i vraa iz programa rezultat expr izraza, (def. 0)
S92 / 47
50. print, printf
print expr, expr, ...
邸tampa argumente
ako nema argumenata 邸tampa $0
printf fmt, expr, expr, ...
printf (fmt, expr, expr, ...)
邸tampa argumente expr prema formatu fmt
radi kao C printf format
S92 / 50
51. Izlaz
ORS nakon svakog ispisa stavlja Output Record Separator
(def ORF= n)
OFS Output Field Separator odvaja pojedina polja u ispisu
(def OFS= )
OFMT daje def. format za ispis floating point brojeva za print komandu.
(def OFMT=`%.6g )
S92 / 51
52. Redirekcija izlaza u datoteku
print > expr
printf fmt,expr1 ...exprn > expr
awk uzime string vrijednost expr kao ime datoteke u koju pi邸e izlaz
print >>expr dodavanje na kraj datoteke
razlika `>' i `>>' je va転na samo kod prvog pisanja u datoteku!
S92 / 52
53. Redirekcija izlaza u pipe
print |expr
awk uzima string vrijednost od expr kao ime komande u koju usmjeri pipe
S92 / 53
54. Inaice awk-a
awk standardni awk
nawk new awk
gawk gnu awk (ima i date&time funckije)
kompajler za awk
MSwindows (NT,95,98 3xx), DOS
awk to perl kompajler
S92 / 54
57. Ispis i brojenje linija datoteke
awk '{print NR SEP $0}' SEP=":" input1
awk '{print NR ":" $0}' input1
Primjer ispisuje linije datoteke input1 i ispred svake pi邸e njen redni
broj
S92 / 57
58. Pozivanje programa -f opcijom
awk izvodi program iz addline.awk:
awk -f addline.awk input1
Isti rezultat navoenjem koda u programskoj liniji isto kao i pozivanje
addline.awk
awk {print NR ":" $0} input1
S92 / 58
59. Primjena uzoraka
Ovaj program sve ulazne linije koje poinju sa `January' pi邸e u datoteku
jan (koja mo転e i ne mora postojati), a sve linije koje poinju sa
`February' ili `March' pi邸e u datoteku febmar.
/^January/ {print >> "jan"}
/^February|^March/ {print >> "febmar"}
S92 / 59
60. Sumiranje i statistike ulaza
Ovaj program rauna ukupan broj uitan rijei u tekstu i srednju du転inu linije
teksta po broju rijei
{s += $NF}
END{print "sum is",s,"average is",s/NR}
S92 / 60
61. Zamjena redoslijeda polja u
ulazu
Program zamjenjuje redoslijed prvog i drugog polja u ulazu
{
tmp = $1
$1 = $2
$2 = tmp
print
}
S92 / 61
62. Kori邸tenje printf komande
Program umee brojeve linija. Brojevi su lijevo poravnani
{printf "%-6d: %sn", NR, $0}
S92 / 62
63. tampanje ulaza u obratnom
redoslijedu
Program 邸tampa ulaz u obratnom redoslijedu, koristei polje (veliki
utro邸ak memorije)
{a[NR] = $0; #index using record number }
END {
for (i = NR; i>0; --i)
print a[i]
}
S92 / 63
64. Brojenje linija po nekom
kljuu
Broje se linije koji imaju istu prvu rije
#array indexed using the first field
{ ++a[$1]}
#note output will be in undefined order
END {
for (i in a)
print a[i], "lines start with", i
}
S92 / 64
65. Brojenje linija po ulaznim
datotekama
Broje se linije za svaku ulaznu datoteku
{ ++a[FILENAME] }
END {
for (file in a)
if (a[file] == 1)
print file, "has 1 line"
else
print file, "has", a[file], "lines
}
S92 / 65
66. Kori邸tenje dvodimenzionalnih
polja u awk-u (I)
Za ulazne podatke provo polje je broj produkta, drugo polje je mjesec, a tree
polje koliinu. Program generira tabelu koliko je ega bilo u kom mjesecu
Jan Feb Mar
1#
2#
S92 / 66
67. Kori邸tenje dvodimenzionalnih
polja u awk-u (II)
BEGIN { NUMPROD = 5 }
{array[$1,$2] += $3 }
END {
print "t Jant FebtMarchtAprilt Mayt"
"JunetJulyt AugtSeptt Octt Novt Dec
for (prod = 1; prod <= NUMPROD; prod++) {
printf "%-7s", "prod#" prod
for (month = 1; month <= 12; month++){
printf "t%5d",array[prod,month]
}
printf "n"
}
}
S92 / 67
68. Kori邸tenje funkcija (I)
Program inicijalizira polje u memoriji koristei sluajne brojeve.
Na osnovi unosa dvaju polja (koristi ih kao koordinate) utvruje da li je do邸lo
do pogotka ili ne.
Za inicijaliziranje se koristi funkcija, definirana na poetku koda.
S92 / 68
69. Kori邸tenje funkcija (II)
function randint(){return (int((rand()+1)*10))}
BEGIN {
prize[randint(),randint()] = "$100";
prize[randint(),randint()] = "$10;
prize[1,1] = "the booby prize
}
{
if (($1,$2) in prize)
printf "You have won %s!n", prize[$1,$2]
}
S92 / 69
70. Obratno 邸tampanje sadr転aja
linije
Programa 邸tampa linije koje imaju isto prvo i zadnje polje, a polja u
liniji 邸tampa od zadnjeg prema prvom
$1==$NF {
for (i = NF; i > 0; --i)
printf "%s", $i(i>1 ? OFS : ORS)
}
S92 / 70
71. Rekurzija
Raunanje faktorjela rekurzivnim pozivima
f(x)=x * f(x-1), x > 1, f(1)=1
function f (num) {
if (num <= 1)return 1
else return num * f(num - 1)
}
{ print $0 " factorial is " f($0) }
S92 / 71
72. Getline & pipe (I)
itanje podataka iz pipe-a i njihova obrada u awk-u
function words(file, string) {
string = "wc " fn
string | getline
close(string)
return ($2)
}
S92 / 72
73. Getline & pipe
BEGIN {
for (i=1; i<ARGC; i++) {
fn = ARGV[i]
printf "There are %d words in %s.",
words(fn), fn
}
}
S92 / 73