Ero sivun ”Awk” versioiden välillä

Linux.fista
Siirry navigaatioon Siirry hakuun
p (linkit laajoihin manuaalisivuihin)
(wikitystä, joku awk:ta osaava voisi selkeyttää edelleen)
Rivi 1: Rivi 1:
'''awk'''- ohjelmointikielen avulla voit helposti muuntaa tekstitiedoston rakennetta. awk ja sen laajennettu versio gawk kuuluvat unix/linux käyttäjän perustyökaluihin silloin kun sinun tarvitsee:
'''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:


* muuntaa puhdas tekstitiedosto riveittäin toiseen muotoon
* puhtaan tekstitiedoston muuntaminen riveittäin toiseen muotoon
* suodattaa tekstistä rivejä pois tavalla johon [grep] ei kykene
* rivien suodattaminen pois tekstistä tavalla, johon [[grep]] ei kykene
* laskea laskuja riveillä olevista numeroista
* laskujen laskeminen riveillä olevilla numeroilla


== Käyttö ==


== Esimerkkejä miten awkia käytetään ==
Tiedostoa data.txt, jonka sisältö on seuraava:
 
Tiedoston data.txt sisältö on:
  1 2 3
  1 2 3
  4 5 6
  4 5 6
  7 8 9
  7 8 9
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 kerran aluksi
  # tämä begin-lohko ajetaan aluksi kerran
  BEGIN {
  BEGIN {
     printf("alkutemput\n---------\n");
     printf("alkutemput\n---------\n");
  }
  }
  # tässä välissä on varsinainen awk ohjelmien 'äly'. Näitä lohkoja
  # 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
  # voi olla useita, ja niiden eteen voi laittaa ehdon, jolla ko. rivi ajetaan.
  # jos alla olevan lohkon alun muuttaisi $1 == 4 { niin lohko ajettaisiin
  # Jos alla olevan lohkon alun muuttaisi $1 == 4 { niin lohko ajettaisiin
  # vain riville joka alkaa numerolla 4. Ilman ehtoa se ajetaan kaikille riveille
  # vain riville joka alkaa numerolla 4. Ilman ehtoa se ajetaan kaikille riveille
  {
  {
Rivi 30: Rivi 31:
  }
  }


Komento <tt>awk -f apu.awk <data.txt</tt> tuottaa tällaisen:
Kun tiedosto data.txt syötetään ylläkuvatulle awk-ohjelmalle komennolla
 
awk -f apu.awk <data.txt</tt>
 
on tulos seuraava:
 
  alkutemput
  alkutemput
  ----------
  ----------
Rivi 40: Rivi 46:




Tällä komennolla etsit 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}'


Edellä olevista esimerkeistä voi huomata että awk:in syntaksi on lähellä C:n syntaksia. Aloittelija saattaa kuitenkin yllättyä siitä että:
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.
* muuttujilla ei ole tyyppiä ja muunnokset tehdään automaattisesti.
* Taulukkoindekseinä voi käyttää 'mitä tahansa', tästä on paljon hyötyä siinä mihin awk on tarkoitettu
* 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.
* syöttödata pilkotaan automaattisesti $1..n numeroiduiksi kentiksi yleensä välilyönnin kohdalta.
* virheilmoituksien tulkinta voi olla hankalaa
* virheilmoitusten tulkinta voi olla hankalaa


Awk:ia 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: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ävä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 megoja).
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).


== Linkkejä ==
== Linkkejä ==


http://www.cs.uu.nl/~piet/docs/nawk/nawk_toc.html
*[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
*[http://www.cs.utah.edu/dept/old/texinfo/gawk/gawk_toc.html Gawk-opas]





Versio 1. huhtikuuta 2006 kello 20.53

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).

Linkkejä