AWK Aho Weinberger Kernighan struktuurse teksti töötlemise keel rikkalikult tekstitöötlusvahendeid omal alal suhteliselt lihtne ja kiiresti realiseeritav
AWK kasutusalad raportite genereerimine ühest formaadist teise konvertimine arvuliste andmete matemaatiline (statistiline) töötlemine lihtsate tekstil baseeruvate andmete/andmebaaside haldamine
AWK 1977 AT&T Bell Labs 1985 - uus versioon, mitmed täiendused, SVR 3.1 SVR 4, POSIX standardid 1986 - GNU Awk, gawk - P.Rubin, A. Robbins nawk vs. oawk mawk - M. Brennan
awk programmi üldkuju: tingimus { käsud } tingimus { käsud }... tingimused jaotuvad: otsingusõna (/otsisõna/) loogiline avaldis ( MYVAR > 2 ) spetsiaalkonstruktsioon (BEGIN, END) vahemik ( tingimus1, tingimus2 )
awk iga sisendrea korral vaadatakse kõiki tingimusi kui tingimus on täidetud, täidetakse vastav käsublokk tühi tingimus on täidetud
awk käivitamine: > awk 'programm' fail1 fail2.. > awk -f programmfail sisendfailid käsurealt käivitades oluline jälgida ', tasakaalu
awk - esimesed sammud BEGIN { print Tere! } { print } NR > 2 && NR < 5 {print} /märts/ {loendur++} # kommentaar
esimesed näited awk
gawk - muutujad sissehitatud muutujad FS, OFS - väljaeraldaja RS, ORS - kirjeeraldaja ARGC, ARGV - (käsurea)argumendid NF - veergude arv NR - rea (kirje) number $1 - $N - veergude väärtused $0 - terve sisendkirje Näide
gawk - muutujad väärtustamine muutuja = väärtus kasutamine: { print muutuja } väärtustamisoperaatorid: muutuja++ muutuja-- ++muutuja muutuja+=avaldis
gawk - massiivid väärtustamine massiiv[indeks]=väärtus kasutamine {print massiiv[indeks]} kontrollimine indeks in massiiv delete Näide
gawk - regulaaravaldised otsisõne - regulaaravaldisena /märts apr/ {print mingiveerg} standardsed regulaaravaldised + laiendused loogiline operaator ~ avaldis ~ /regavaldis/
gawk - tõeväärtused mitte-null, mitte-tühi: tõene null, tühi: väär && - loogiline JA - loogiline VÕI! - eitus Näide
gawk - sisendi lugemine sisendfailide järjekord muutuja FILENAME sisendkirjed ja RS sisendväljad ja FS eraldajad mittekonstantne indeks {print $(2+2)}
gawk - funktsioone print printf - C stiilis next järgmine kirje nextfile järgmine fail exit
gawk funktsioone mat. funktsioonid int,sqrt,sin,rand jms sõnetöötlusfunktsioonid length, index, match, split, sub, substr jms sisend-väljund close, system bititasemel loogika and, or, xor, not, lshift...
gawk - konstruktsioone if (tingimus) käsk else käsk while (tingimus) käsk
gawk - konstruktsioone for (algv; lõpp; suurend) käsk for (muutuja in massiiv) käsk do käsk while (tingimus)
gawk - konstruktsioone for, while, do-while: break continue
gawk - konstruktsioone switch (avaldis) { } case väärtus: käsk default: käsk
gawk - kasutussoovitusi awk sobib ennekõike siis, kui ühes sisendreas täpselt üks sisendkirje tuleb harjuda põhimõttega, et (peaaegu) kõik read täidetakse iga sisendrea korral uuesti vahel on kasulik kirjutada oma awk-programmile sh-mähis interpreteeritav keel - ei sobi väga mahukateks projektideks
gawk: kasutaja funktsioonid defineerimine definitsioon võib asuda koodis suvalises kohas defineerimise järjekord pole tähtis function funktsiooni_nimi(param) { } sisu
gawk:kasutaja funktsioonid parameetrid argumendid kohalikud muutujad function linkprint(a,b, c) { } c="fail: %s \t Linke: %d\n" printf c,b,a
gawk:kasutaja funktsioonid välja kutsumine $2 > 1 {linkprint($2,$9)} Näide parameetriks muutuja: call by value parameetriks massiiv: call by reference Näide
gawk: kasutaja funktsioonid väärtuse tagastamine return avaldis return ilma avaldiseta: funktsiooni töö lõpetatakse, tagastusväärtus defineerimata return puudub: awk eeldab, et kutsuti return ilma avaldiseta Näide
gawk:tekstitöötlusfunktsioone asort(array) - sortimine index(in,find) - alamsõne find algusindeks sõnes in length(string) - sõne pikkus match(string, regex) - reg. avaldisele vastava alamsõne (vasakult poolt, pikim) indeks split(string,array,sep) - tükeldab sõne, eraldajaks sep, tulemus massiivi
gawk:tekstitöötlusfunktsioone strtonum(string) sõne arvuks sub(regexp, asendus, string) asendab stringis reg. avaldisega vasakpoolseima leitud otsisõne gsub(regexp,asendus,string) asendab kõik leitud mittekattuvad otsisõned
gawk:tekstitöötlusfunktsioone substr(string, start, length) kindla pikkusega/positsiooniga alamstringi leidmine tolower(string), toupper(string) suurtähtede/väiketähtede konversioon
gawk: printf printf vorming,muutujad/avaldised { p= kolmapäev n=3 printf Täna on:%s, see on %d. päev nädalas,p,n }
gawk: printf { fmt= Täna on:%s, see on %d. päev nädalas,p,n p= kolmapäev printf fmt,p,1+2 }
gawk:printf vorming võib sisaldada: tavaline tekst vorminguelemendid näitab, kuhu asendada parameetriks olevad muutujad, kuidas neid vormindada vormingulemente: %d - täisarv %s - string %f - ujukomaarv
gawk:printf vorminguelementidele saab anda täpsustusi: %.10d - täisarv, min. 10 kohta %.10f - ujukomaarv, vähemalt 10 kohta peale koma %10s - string, minimaalselt 10 märki lai %.10s - string, maksimaalselt 10 märki lai %s$2 - positsiooniline täpsustus, kasutatakse muutujat/avaldist, mis on antud teise parameetrina peale vormingut
gawk:printf sprintf printf stringi Näide
gawk:profileerimine lihtne gawk profileerija: pgawk loendab iga käsu / konstruktsiooni väljakutseid tingimuslausete ja reg. avaldiste puhul kaks näitajat: väljakutsete arv tingimuse täidetuste arv väljund ümberformaaditud
gawk:profileerimine pgawk -f programm andmefail väljund awkprof.out pgawk -W profile=proffail -f programm andmefail
gawk:profileerimine kasulik testimisel kas testikomplekt on piisav, läbitakse iga koodirida? kasulik optimeerimisel millises koodi osas veedetakse rohkem samme (aega pgawk kahjuks ei mõõda) Näide
gawk:getline paindlik, sõltumatu sisendi lugemine algaja võiks esialgu hoiduda, vähemalt teatud vormidest ilma argumentideta: loeb järgmise kirje kohe getline väärtustab $0, NF, FNR, NR lugemine muutujasse getline var Väärtustab var, FNR, NR
gawk:getline lugemine failist: loeb järgmise kirje failist getline < file väärtustab $0, NF lugemine failist muutujasse: loeb järgmise kirje failist muutujasse getline var < file väärtustab var
gawk:getline lugemine torust: command getline väärtustab $0,NF lugemine torust muutujasse: command getline var väärtustab var
gawk:getline lugemine kahepoolsest torust: command & getline väärtustab $0, NF lugemine kahepoolsest torust muutujasse: command & getline var väärtustab var
gawk:kahesuunaline toru suhtlemiseks välise programmiga saab anda välisele programmile sisendit saab lugeda selle programmi väljundit käsk & välineprogramm välineprogramm & käsk
gawk:kahesuunaline toru BEGIN { kask= bc printf %d+%d\nquit\n,3,3 & kask kask & getline vastus print vastus } Näide
gawk:kahesuunaline toru kergesti võib tekkida lukusituatsioon teised osapooled ei pruugi oma väljundpuhvrit tühjendada (flush) meie programm ootab väliselt programmilt sisendit, kuid see on väljundpuhvrist väljundisse lükkamata väline programm ootab meiepoolset tegutsemist
gawk:kahesuunaline toru lahendusi lukusituatsioonile kogu sisend ühe korraga ja seejärel toru ühepoolselt kinni: sunnib välist programmi väljundpuhvrit tühjendama võimalusel kirjutada väline programm nii, et see tühjendaks väljundpuhvri gawk tühjendab & puhul puhvri, muu väljastamise korral tuleb kutsuda funktsiooni fflush()
gawk:kahesuunaline toru Näide: 2 gawk programmi suhtlevad käikude haaval, üks käik tähendab vastasele mingi arvu ütlemist, kusjuures arv peab olema suuremvõrdne vastase eelmisest käigust.