Rekisteröitymätön käyttäjä
Ero sivun ”Awk” versioiden välillä
Siirry navigaatioon
Siirry hakuun
Muuttujista ja funktioista
Pb (keskustelu | muokkaukset) p (→Aiheesta muualla: lisenssi) |
(Muuttujista ja funktioista) |
||
Rivi 7: | Rivi 7: | ||
Awk on skriptikieli ja samanniminen tulkki tälle skriptikielelle. Se on tarkoitettu tiedon hakemiseen selkeän rakenteen omaavista tekstitiedostoista ja tämän tiedon esittämiseen siistissä muodossa. Sen kehittäminen aloitettiin jo 1977 samassa AT&T:n tutkimuslaboratoriossa (''Bell Labs''). Samassa paikassa aloitettiin myös [[Unix]]in kehittäminen. | Awk on skriptikieli ja samanniminen tulkki tälle skriptikielelle. Se on tarkoitettu tiedon hakemiseen selkeän rakenteen omaavista tekstitiedostoista ja tämän tiedon esittämiseen siistissä muodossa. Sen kehittäminen aloitettiin jo 1977 samassa AT&T:n tutkimuslaboratoriossa (''Bell Labs''). Samassa paikassa aloitettiin myös [[Unix]]in kehittäminen. | ||
Awk:n | Awk:n tilalla on monesti käytetty [[Perl]]iä, joka on kehitetty mm. ratkaisemaan samankaltaisia ongelmia kuin awk. Awk:n opettelu ei silti ole turhaa, sillä: | ||
*Awk on yksinkertaisempi (tärkeää jos mietit, kumman opettelisit ensin) | *Awk on yksinkertaisempi (tärkeää jos mietit, kumman opettelisit ensin) | ||
*Awk:n syntaksi on säännöllisempi | *Awk:n syntaksi on säännöllisempi | ||
*Awk löytyy lähestulkoon järjestelmästä kuin järjestelmästä, Perl-tulkki ei | *Awk löytyy lähestulkoon järjestelmästä kuin järjestelmästä, Perl-tulkki ei | ||
*[http://pubs.opengroup.org/onlinepubs/009695399/utilities/awk.html IEEE:n Unix-standardi] määrittelee Awk:n melko kattavasti, kun taas Perlin parametrit ja syntaksi ovat eläneet päätoteutuksen mukana | |||
Tärkeää on siis ymmärtää, että Awk ei ole ainoa työkalu tietyntyyppisten ongelmien ratkaisemiseen. Eikä se ole myöskään monipuolisin. Se saattaa kuitenkin monissa tilanteissa olla yksinkertaisempi käyttää kuin | Tärkeää on siis ymmärtää, että Awk ei ole ainoa työkalu tietyntyyppisten ongelmien ratkaisemiseen. Eikä se ole myöskään monipuolisin. Se saattaa kuitenkin monissa tilanteissa olla yksinkertaisempi käyttää kuin Perl-skriptit. | ||
== Syntaksi == | == Syntaksi == | ||
Rivi 55: | Rivi 56: | ||
== BEGIN- ja END-lohkot == | == BEGIN- ja END-lohkot == | ||
Awk käsittelee syötteensä [[grep]]in ja [[sed]]in tavoin rivi kerrallaan. BEGIN- ja END-lohkoissa suoritetaan asiat, jotka on kuitenkin tarkoitus tehdä suoritusaikana vain kerran ennen ja jälkeen varsinaisen syötteen käsittelyä. | |||
awk 'BEGIN {aluksi} lauseke1 {jokaiselle lauseke1:lle} \ | |||
lauseke2 ... END {lopuksi}' tiedosto | |||
== Ehtolauseet ja vertailut == | == Ehtolauseet ja vertailut == | ||
Rivi 104: | Rivi 108: | ||
== Muuttujat == | == Muuttujat == | ||
Shell-muuttujia voi välittää AWK:lle luettelemalla ne parametreissa. Luvun 12 tulostus: | |||
a=12 | |||
echo '\n' | awk -v a=$a 'END {print a}' | |||
{| border=1 | |||
|- | |||
|'''Muuttuja''' | |||
|'''Selitys''' | |||
|- | |||
|FNR | |||
|Rivinumero tiedostossa, BEGIN-lohkossa 0. | |||
|- | |||
|FS | |||
|Kentän erotin, vakiona <space>. | |||
|- | |||
|NF | |||
|Kenttien lukumäärä rivissä, BEGIN-lohkossa määrittelemätön. | |||
|- | |||
|NR | |||
|Rivinumero syötteessä kokonaisuutena, BEGIN-lohkossa 0. | |||
|- | |||
|OFMT | |||
|Formaatti numeroille printf-komennossa, oletuksena "%.6g". | |||
|- | |||
|OFS | |||
|print-komennon kenttäerotin, oletuksena <space>. | |||
|- | |||
|ORS | |||
|print-komennon rivierotin, oletuksena <newline>. | |||
|- | |||
|RLENGTH | |||
|match-funktion tuloksen pituus. | |||
|- | |||
|RS | |||
|Rivierotin, vakiona <newline>. | |||
|- | |||
|RSTART | |||
|match-funktion paluuarvo, eli merkkijonon ensimmäisen merkin sijainti rivillä. | |||
|- | |||
|} | |||
Muuttuja $0 viittaa kulloiseenkin riviin kokonaisuudessaan. | |||
{}-lohkojen sisällä voi määritellä muuttujia C-sukuisten kielten tavoin: | |||
awk 'BEGIN {a=2} {if (NR % a == 0) print $0; else print "---"}' | |||
== Funktiot == | |||
{| border=1 | |||
|- | |||
|'''Funktio''' | |||
|'''Kuvaus''' | |||
|- | |||
|sub(ere, repl[, in ]) | |||
|Korvaa rivin ensimmäisen eren replillä. | |||
|- | |||
|gsub(ere, repl[, in ]) | |||
|Korvaa rivin kaikki eret repleillä. | |||
|- | |||
|length[([s])] | |||
|Palauttaa parametrin tai koko rivin pituuden. | |||
|- | |||
|match(s, ere) | |||
|Palauttaa eren alun paikan s:ssä. | |||
|- | |||
|split(s, a[, fs ]) | |||
|Paloittelee s:n a:han. fs oletuksena FS. | |||
|- | |||
|substr(s, m[, n ]) | |||
| - | |||
|- | |||
|tolower(s) | |||
| - | |||
|- | |||
|toupper(s) | |||
| - | |||
|- | |||
|close(exp) | |||
| - | |||
|- | |||
|getline | |||
|Siirtyy seuraavalle riville. | |||
|- | |||
|system(exp) | |||
|Komento Awk:n ulkopuolelle. | |||
|} | |||
== Taulukot == | == Taulukot == | ||
== | == Esimerkkejä == | ||
Tiedostoa data.txt, jonka sisältö on seuraava: | Tiedostoa data.txt, jonka sisältö on seuraava: | ||
Rivi 115: | Rivi 204: | ||
käsitellään seuraavanlaisen awk-ohjelman avulla: | käsitellään seuraavanlaisen awk-ohjelman avulla: | ||
# tämä on awk ohjelma apu.awk | # tämä on awk ohjelma apu.awk | ||
# tämä begin-lohko ajetaan aluksi kerran | # tämä begin-lohko ajetaan aluksi kerran | ||
Rivi 134: | Rivi 222: | ||
Kun tiedosto data.txt syötetään ylläkuvatulle awk-ohjelmalle komennolla | Kun tiedosto data.txt syötetään ylläkuvatulle awk-ohjelmalle komennolla | ||
awk -f apu.awk <data.txt> | awk -f apu.awk <data.txt> | ||
on tulos seuraava: | on tulos seuraava: | ||
alkutemput | alkutemput | ||
---------- | ---------- | ||
Rivi 149: | Rivi 235: | ||
Seuraavalla komennolla etsitään pieniä, alle 100 merkin tiedostoja /etc-hakemistosta: | Seuraavalla komennolla etsitään pieniä, alle 100 merkin tiedostoja /etc-hakemistosta: | ||
ls -l /etc |awk '$5 < 100 {printf "%6s %s\n",$5,$8}' | |||
Poimitaan ja siistitään nykyinen resoluutio xrandr-komennon tulosteesta: | |||
xrandr -q | awk 'NR==2 {sub(/\+.*\+.*/,"",$3; print $3}' | |||
== Muuta == | == Muuta == | ||
Rivi 161: | Rivi 250: | ||
*[http://www.cs.uu.nl/~piet/docs/nawk/nawk_toc.html Awk-opas] | *[http://www.cs.uu.nl/~piet/docs/nawk/nawk_toc.html Awk-opas] | ||
*[http://www.cs.utah.edu/dept/old/texinfo/gawk/gawk_toc.html Gawk-opas] | *[http://www.cs.utah.edu/dept/old/texinfo/gawk/gawk_toc.html Gawk-opas] | ||
*[http://www.pement.org/awk/awk1line.txt Havainnollistavia yksirivisiä] | |||
[[Luokka:Komentorivin perustyökalut]] | [[Luokka:Komentorivin perustyökalut]] |