際際滷

際際滷Share a Scribd company logo
awk

 trajanje: 1 dan
    priredili:
Rajnovi Damir
  Delija Damir
  verzija 1.0
 Kolovoz 1998.
       S92 / 1
S95   Sigurnost raunala i mre転a


S94   Sistemska administracija
      mre転nih aplikacija



S93   TCP/IP


S92   UNIX sistemska administracija


S91   Operacijski sustav UNIX




                  S92 / 2
Ciljevi teaja
   upoznati se sa awk
    jezikom i alatima
   osposobiti se za
    samostalni rad sa awk
    jezikom




                            S92 / 3
Podruja
   Pregled awk jezika
   Primjeri kori邸tenja awk jezika




                            S92 / 4
Potrebno predznanje
   Korisniki rad sa UNIX-om
   Poznavanje shell-a
   Poznavanje UNIX-a utilities




                           S92 / 5
皆温糸姻転温逮
                     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
to neete nauiti na teaju
   Puno toga!
   Neete dobiti gotove
    recepte za sve va邸e
    probleme




                            S92 / 7
Izvori
   Awk & Sed, OReilly & Associates, inc.
   SunOS dokumentacija
   OSF1 dokumentacija,




                           S92 / 8
Uvod

                              awk
   promjena podataka
   jezik za generiranje izvje邸taja
   jezik za pisanje interpretiranih filter program




                               S92 / 9
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
awk program

   awk program se sastoji iz proizvoljnog broja
    definiranih funkcija i pravila oblika:

                  pattern {action}

   Prije izvoenja programa kod se prevodi !




                           S92 / 11
awk program
                                                ulazni podaci
Begin { akcija }


       $0, $1, $2 ... $NF           linija teksta

    uzorak1{ akcija }


    uzorak2 { akcija }                     ispis rezultata

END { akcija }


                         S92 / 12
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
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
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
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
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
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
Konstante
   Brojane konstante su niz dekadskih znamenki
                        a=123.5
   String konstante su navedene u navodnicima
                   a=ima i nema 12.3




                          S92 / 19
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
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
Ugraene varijable
              ARGV i ARGC
   ARGV polje sadr転i argumente komandne linije

   ARGC broj argumenata komandne linije




                              S92 / 22
Operatori
   awk koristi standardnu hijerarhiju matematikih
    operatora

   ako dva izraza nisu odvojena operatorom, awk ih
    povezuje kao jedan string.
                     a1 b2      a1b2




                           S92 / 23
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
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
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
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
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
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
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
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
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
Ugraene matematike
             funkcije
int(expr)

exp(expr), log(expr), sqrt(expr)

sin(expr), cos(expr)

atan2(expr1, expr2)




                         S92 / 33
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
Funkcija system
system funkcija izvodi vanjsku komandu expr i vraa rezultat

                         status = system(expr)




                           system("tail " $1)




                                     S92 / 35
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
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
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
IF - THEN - ELSE
# if statement AKO TADA INAE

if (condition){
      statement
} else {
      statement
}




                         S92 / 39
Komentar

#   znak u liniji, komentar je sve do kraja linije

komanda ;# za komentar u istoj liniji sa komandama




                                     S92 / 40
Petlje (loops)

    while

     do

     for



     S92 / 41
while
# while loop
while (uslov) {
  komanda
}

   odvija se sve dok je uslov istina (!= 0)




                                     S92 / 42
do-while
# do-while loop
do {
  komanda
} while (uslov)

   odvija se dok je uslov la転!




                                  S92 / 43
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
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
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
exit

exit [(expr)]

   prelazi na END uzorak i vraa iz programa rezultat expr izraza, (def. 0)




                                   S92 / 47
return
return [expr]

   vraa program iz funkcije, rezultat je expr




                                 S92 / 48
delete
delete array[i]
array[i]=

   bri邸e i-ti element iz polja array




                                        S92 / 49
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
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
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
Redirekcija izlaza u pipe
print |expr

   awk uzima string vrijednost od expr kao ime komande u koju usmjeri pipe




                                     S92 / 53
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
Pauza
Ruak




 S92 / 55
Praktian rad i primjeri




          S92 / 56
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
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
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
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
Zamjena redoslijeda polja u
               ulazu
   Program zamjenjuje redoslijed prvog i drugog polja u ulazu

{
    tmp = $1
    $1 = $2
    $2 = tmp
    print
}




                                  S92 / 61
Kori邸tenje printf komande
   Program umee brojeve linija. Brojevi su lijevo poravnani

               {printf "%-6d: %sn", NR, $0}




                                  S92 / 62
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
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
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
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
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
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
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
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
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
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
Getline & pipe
BEGIN {
   for (i=1; i<ARGC; i++) {
   fn = ARGV[i]
   printf "There are %d words in %s.", 
      words(fn), fn
   }
}




                             S92 / 73
Pitanja



 ?

  S92 / 74

More Related Content

Awk 1 day course

  • 1. awk trajanje: 1 dan priredili: Rajnovi Damir Delija Damir verzija 1.0 Kolovoz 1998. S92 / 1
  • 2. S95 Sigurnost raunala i mre転a S94 Sistemska administracija mre転nih aplikacija S93 TCP/IP S92 UNIX sistemska administracija S91 Operacijski sustav UNIX S92 / 2
  • 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
  • 33. Ugraene matematike funkcije int(expr) exp(expr), log(expr), sqrt(expr) sin(expr), cos(expr) atan2(expr1, expr2) S92 / 33
  • 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
  • 41. Petlje (loops) while do for S92 / 41
  • 42. while # while loop while (uslov) { komanda } odvija se sve dok je uslov istina (!= 0) S92 / 42
  • 43. do-while # do-while loop do { komanda } while (uslov) odvija se dok je uslov la転! S92 / 43
  • 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
  • 48. return return [expr] vraa program iz funkcije, rezultat je expr S92 / 48
  • 49. delete delete array[i] array[i]= bri邸e i-ti element iz polja array S92 / 49
  • 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
  • 56. Praktian rad i primjeri S92 / 56
  • 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
  • 74. Pitanja ? S92 / 74