Ero sivun ”Awk” versioiden välillä

Siirry navigaatioon Siirry hakuun
2 238 merkkiä lisätty ,  7. lokakuuta 2013
Muuttujista ja funktioista
(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 käyttö on viime aikoina vähentynyt ja sen 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: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 monimutkaiset Perl-skriptit.
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 ==


== Esimerkejä ==
== 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}'


  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]]
Rekisteröitymätön käyttäjä

Navigointivalikko