4 175
muokkausta
pEi muokkausyhteenvetoa |
(perusoppaan alkua, osittain kopiointia Unix.sestä koska lisenssi sen sallii) |
||
Rivi 1: | Rivi 1: | ||
'''awk'''- | '''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 | ||
== | == 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}' | ||
== Muuta == | |||
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]] |