Ero sivun ”Awk” versioiden välillä

Siirry navigaatioon Siirry hakuun
3 251 merkkiä lisätty ,  26. syyskuuta 2008
perusoppaan alkua, osittain kopiointia Unix.sestä koska lisenssi sen sallii
pEi muokkausyhteenvetoa
(perusoppaan alkua, osittain kopiointia Unix.sestä koska lisenssi sen sallii)
Rivi 1: Rivi 1:
'''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:
'''awk'''-työkalun 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
* puhtaan tekstitiedoston muuntaminen riveittäin toiseen muotoon
* rivien suodattaminen pois tekstistä tavalla, johon [[grep]] ei kykene
* rivien suodattaminen pois tekstistä tavalla, johon [[grep]] ei kykene
* laskujen laskeminen riveillä olevilla numeroilla
* laskujen laskeminen riveillä olevilla numeroilla


== Käyttö ==
== Johdanto ==
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 on yksinkertaisempi (tärkeää jos mietit, kumman opettelisit ensin)
*Awk:n syntaksi on säännöllisempi
*Awk löytyy lähestulkoon järjestelmästä kuin järjestelmästä, Perl-tulkki ei
 
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.
 
== Syntaksi ==
Awk:n syntaksi on lähellä [[C]]:n syntaksia. Seuraavat asiat on kuitenkin syytä huomioida:
* 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
 
Yksinkertaisimmillaan awk:ta voidaan käyttää riveillä muotoa
lauseke {komento}
missä ''lauseke'' voi olla säännöllinen lauseke tai etsittävä merkkijono. Esimerkiksi rivi
/linux/ {print}
tulostaisi kaikki rivit, joilla esiintyy sana "linux".
 
== Awk-ohjelman käyttö ==
Awk:ta käytetään komentoriviltä antamalla sille syötteenä skripti ja tiedosto, jota tällä skriptillä käsitellään. Skripti voidaan antaa joko komentoriviparametrina tai pidempien skriptien kanssa antamalla parametrina tiedosto, josta skripti ladataan. Eli joko
awk -f skripti.awk tiedosto.txt
tai
awk '/linux/ {print}' tiedosto.txt
 
== Kenttien käsittely ==
Awk:n vahvin puoli on sen kyky käsitellä tiedoston sisältöä kenttinä. Esimerkiksi voimme helposti tulostaa tekstitaulukosta jokaisen rivin kolmannet solut.
 
Tutkitaan esimerkiksi tiedostoa [[Passwd-tiedosto|/etc/passwd]] josta löytyy tietokoneen käyttäjien käyttäjätunnukset. Tämä tiedosto on muotoa
<pre>
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
</pre>
Leikitään, että haluamme tulostaa tiedostosta käyttäjien nimet. Käyttäjätunnus on jokaisella rivillä ensimmäinen kenttä, jos kentät erotellaan :-merkillä. Tehdään tällainen Awk-skripti.
 
Määritellään ensin erotinmerkiksi kaksoispiste asettamalla se muuttujan FS komennolla
FS = ":"
Komentoriviltä käytettäessä tämä voitaisiin asettaa valitsimella -F:
awk -F ":" ....
Tämän jälkeen awk erottelee jokaiselta riviltä vuorotellen kaksoispisteen erottamat merkkijonot (kentät) muuttujiin $1, $2,... Esimerkiksi tässä tapauksessa ensimmäisellä rivillä $1 olisi "root" ja $2 olisi "x". Nyt voimme tulostaa jokaiselta riviltä ensimmäisen kentät komennolla <tt>print $1</tt>, eli lopullinen awk-skriptitiedosto olisi
FS = ":"
{ print $1 }
Toisaalta tämä voitaisiin ajaa myös yhdellä komennolla:
awk -F : '{print $1}' /etc/passwd
 
== BEGIN- ja END-lohkot ==
 
== Ehtolauseet ja vertailut ==
 
== Printf ==
 
== Silmukat ==
 
== Muuttujat ==
 
== Taulukot ==
 
== Esimerkejä ==


Tiedostoa data.txt, jonka sisältö on seuraava:
Tiedostoa data.txt, jonka sisältö on seuraava:
Rivi 50: Rivi 111:
  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:n syntaksi on lähellä C:n syntaksia. Aloittelija saattaa kuitenkin yllättyä siitä että:
== Muuta ==
* 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: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.  


Rivi 61: Rivi 117:


==Aiheesta muualla==
==Aiheesta muualla==
 
*[http://www.unix.se/AWK AWK-opas Unix.se-wikissä] (ruotsiksi). Tämä ohje perustuu osittain kyseiseen Unix.sen ohjeeseen (lisensoitu Creative Commons nimi mainittava -lisenssillä)
*[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]


[[Luokka:Komentorivin perustyökalut]]
[[Luokka:Komentorivin perustyökalut]]

Navigointivalikko