AWK

Wikipediasta
Siirry navigaatioon Siirry hakuun
Tulostettavaa versiota ei enää tueta ja siinä voi olla renderöintivirheitä. Päivitä selaimesi kirjanmerkit ja käytä selaimen tavallista tulostustoimintoa sen sijaan.
AWK
Julkaistu 1979
Suunnitellut Alfred Aho, Peter Weinberger, Brian Kernighan
Vakaa versio IEEE Std 1003.1-2008[1]
Merkittävimmät toteutukset awk, GNU AWK (gawk), nawk, mawk, awk (BusyBox), goawk
Vaikutteet C
Vaikuttanut Perl
Uutisryhmä comp.lang.awk

AWK on tekstin käsittelemiseen kehitetty täsmätarkoituksellinen ohjelmointikieli. Kielen ovat kehittäneet Alfred Aho, Peter Weinberger ja Brian Kernighan Bell Labsissa vuonna 1977.[2][3][4] Kieli julkaistiin vuonna 1979 ja sitä on päivitetty myöhempiin julkaisuihin.[3]

Ahon mukaan kielestä tuli suosittu koska se tuli jokaisen Unix-järjestelmän mukana.[5]

AWK-ohjelmat ovat esitysmuodoltaan hyvin tiiviitä. Niissä käytetään yleisesti muun muassa säännöllisiä lausekkeita.[3]

Kieli

AWK-kieli perustuu ehtojen ja toimintojen määrittämiseen:[3]

ehto { toiminto }

Tässä muodossa awk odottaa syötettä ennen tekemistään mitään. awk yrittää sovittaa käskyt jokaiseen lukemaansa tekstiriviin ja jokaista osumaa kohden suoritetaan määrätty toiminto. Lisäksi voidaan määritellä BEGIN- ja END-lohkot, jotka suoritetaan ennen prosessoinnin aloitusta ja sen jälkeen. awkia voi käyttää kahdella tavalla. Ohjelman voi kirjoittaa sen komentoriville tai ladata tiedostosta -f -parametrilla.[3]

Yksinkertainen ohjelma määrittää ehdon ja toiminnon seuraavasti:[3]

$1 == "osoite" { print $2, $3 }

awk jakaa automaattisesti lukemansa tekstin kenttiin (tai sarakkeisiin, field). Näitä merkitään numeroiduilla muuttujilla. Esimerkki tarkistaa ensimmäisen kentän ja tulostaa toisen ja kolmannen, jos se on "osoite". Sarakkeiden erottimina ovat normaalisti välilyönnit ja tabulaattorimerkit. awk pitää myös muutamaa automaattista muuttujaa. FS on kenttien erotin (field separator), NR on käsiteltävän rivin numero ja NF kenttien lukumäärä.[3]

AWK tukee myös muuttujia, assosiaatiotauluja ja käyttäjän määrittämiä funktioita:[3]

func nimi(argumentit) { 
  lausekkeet
}

Toteutukset

Alkuperäinen awk julkaistiin Version 7 UNIX:ssa vuonna 1978. Kielestä tuli suosittu ja sitä käytettiin ei-triviaaleihin ohjelmiin. Kielen suosion innoittamana alkuperäiset tekijät laajensivat kieltä ja uusi versio julkaistiin 1987. Tämä johti merkittäviin yhteensopivuusongelmiin eri versioiden välillä. awkiin tehtiin myös lisää muutoksia Unix System V:n julkaisuun vuonna 1989. System V:n awk standardoidiin POSIX-standardissa, jossa myös tehtiin pieniä korjauksia.[6]

Alkuperäisen Bell Labsissa tehdyn toteutuksen lisäksi kielestä on avoimen lähdekoodin toteutus GNU AWK (gawk), joka on julkaistu vuonna 1988.[7] Muihin toteutuksiin kuuluvat muun muassa Brian Kernighanin nawk ja Mike Brennanin mawk.[7][8][9]

Esimerkkejä

Yksinkertainen AWK-ohjelma, joka tulostaa näytölle tekstin "Hello, world!"

 BEGIN { print "Hello, world!"; }

Tässä Unix-komennon tuloste putkitetaan AWK:lle joka laskee hakemistossa olevien tiedostojen (ml. alihakemistot ja niiden tiedostot) kokojen summan tavuina ja tulostaa tuloksen:

ls -alR | awk '{ s+=$5; } END { print s; }'

Tämä tulostaa kaikki käyttäjätunnukset, joiden uid on suurempi kuin 500, mutta jotka eivät ole "nobody", eli normaalit käyttäjien käyttäjätunnukset. Kenttien erottimena on passwd-tiedostossa kaksoispiste.

awk -F : '$3 > 500 && $1 != "nobody" { print $1 }' < /etc/passwd

Jos toinen kenttä alkaa aalla, rivi tulostetaan. ~ on matching-operaattori, jolla kenttä sovitetaan säännölliseen lausekkeeseen. Tämä tapahtuisi koko riville automaattisesti, jos muuta ei määritellä.

$2 ~ /^[Aa]/ { print }

Rivinumeroiden lisääminen :-merkillä ja välillä erotettuna tapahtuisi ohjelmalla:

{ print NR ":", $0 }

korvaa merkkijohon "USA" merkkijonolla "Yhdysvallat" joka rivillä:

{ gsub(/USA/, "Yhdysvallat"); print }

tulostaa piin arvon:

BEGIN { print atan2(1,1)*4 }

Katso myös

Lähteet

  1. awk - pattern scanning and processing language The Open Group. Viitattu 27.5.2019. (englanniksi)
  2. Awk -- A Pattern Scanning and Processing Language (Second Edition) (1978)
  3. a b c d e f g h Alfred V. Aho & Brian W. Kernighan & Peter J. Weinberger: Awk -- A Pattern Scanning and Processing Language (PDF) doc.cat-v.org. 30.9.2015. doi:10.1.1.31.1299 Viitattu 27.5.2019. (englanniksi)
  4. Aleksey Dolya: Interview with Brian Kernighan 29.7.2003. Linux Journal. Viitattu 7.9.2019. (englanniksi)
  5. Naomi Hamilton: The A-Z of Programming Languages: AWK (sivu 2) 27.5.2008. Computerworld. Arkistoitu 23.3.2019. Viitattu 27.5.2019. (englanniksi)
  6. O'Reilly, sed & awk § 7. Writing Scripts for awk
  7. a b Aharon (Arnold) Robbins: The GNU Project and Me 27 Years with GNU Awk (PDF) skeeve.com. 27.5.2014. Viitattu 27.5.2019. (englanniksi)
  8. mawk – pattern scanning and text processing language invisible-island.net. Viitattu 27.5.2019. (englanniksi)
  9. One true awk github.com. Viitattu 19.4.2024. (englanniksi)

Kirjallisuutta

Aiheesta muualla