Awk

Linux.fista
Versio hetkellä 29. syyskuuta 2007 kello 13.28 – tehnyt Teksturi (keskustelu | muokkaukset)
Siirry navigaatioon Siirry hakuun

awk-ohjelmointikielen avulla voi helposti muuntaa tekstitiedoston rakennetta. awk ja sen laajennettu versio gawk kuuluvat Unix/Linux-käyttäjän perustyökaluihin silloin, kun kyseessä on:

  • puhtaan tekstitiedoston muuntaminen riveittäin toiseen muotoon
  • rivien suodattaminen pois tekstistä tavalla, johon grep ei kykene
  • laskujen laskeminen riveillä olevilla numeroilla

Käyttö

Tiedostoa data.txt, jonka sisältö on seuraava:

1 2 3
4 5 6
7 8 9

käsitellään seuraavanlaisen awk-ohjelman avulla:

# tämä on awk ohjelma apu.awk
# tämä begin-lohko ajetaan aluksi kerran
BEGIN {
   printf("alkutemput\n---------\n");
}
# Tässä välissä on varsinainen awk-ohjelmien 'äly'. Näitä lohkoja
# voi olla useita, ja niiden eteen voi laittaa ehdon, jolla ko. rivi ajetaan.
# Jos alla olevan lohkon alun muuttaisi $1 == 4 { niin lohko ajettaisiin
# vain riville joka alkaa numerolla 4. Ilman ehtoa se ajetaan kaikille riveille
{
 printf "[%s] [%s] [%s] ->  %d\n",$1,$2,$3,$1+$2+$3
}
# tämä end lohko ajetaan kerran lopuksi
END {
    printf("---------\nlopputemput\n");
}

Kun tiedosto data.txt syötetään ylläkuvatulle awk-ohjelmalle komennolla

awk -f apu.awk <data.txt>

on tulos seuraava:

alkutemput
----------
[1] [2] [3] ->  6
[4] [5] [6] ->  15
[7] [8] [9] ->  24
----------
lopputemput


Seuraavalla komennolla etsitään pieniä, alle 100 merkin tiedostoja /etc-hakemistosta:

ls -l /etc |awk '$5 < 100 {printf "%6s %s\n",$5,$8}'

Edellä olevista esimerkeistä voi huomata, että awk:n syntaksi on lähellä C:n syntaksia. Aloittelija saattaa kuitenkin yllättyä siitä että:

  • muuttujilla ei ole tyyppiä ja muunnokset tehdään automaattisesti.
  • taulukkoindekseinä voi käyttää periaatteessa mitä tahansa, tästä on paljon hyötyä niissä tehtävissä, joihin awk on ensisijaisesti tarkoitettu
  • syöttödata pilkotaan automaattisesti $1..n numeroiduiksi kentiksi yleensä välilyönnin kohdalta.
  • virheilmoitusten tulkinta voi olla hankalaa

Awk:n on sanottu joskus olevan "write only language", ja sitä se onkin jos yrittää saada todella monimutkaisesta awk-ohjelmasta selkoa. Omat ohjelmat kannattaa tehdä siten, että kirjoittaa ja testaa ohjelman rivi kerrallaan. Awk on parhaimmillaan lyhyissä muutaman rivin ohjelmissa.

Awk-ohjelmissa ei ole yleensä mitään rajoitusta käsiteltävien tiedostojen koolle, koska niitä käsitellään vain riveinä ja syöttö/tulostus putkina/virtoina. Awk-ohjelmat pystyvät käsittelemään varsin helposti hyvinkin suuria syöttö/tulostustiedostoja (satoja megatavuja).

Aiheesta muualla