Muokataan sivua Awk
Siirry navigaatioon
Siirry hakuun
Kumoaminen voidaan suorittaa. Varmista alla olevasta vertailusta, että haluat saada aikaan tämän lopputuloksen, ja sen jälkeen julkaise alla näkyvät muutokset.
Nykyinen versio | Oma tekstisi | ||
Rivi 1: | Rivi 1: | ||
'''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: | '''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 | ||
Rivi 6: | Rivi 5: | ||
== Johdanto == | == 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ä | 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 == | == 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. | * 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 | * taulukkoindekseinä voi käyttää periaatteessa mitä tahansa, tästä on paljon hyötyä niissä tehtävissä, joihin awk on ensisijaisesti tarkoitettu | ||
Rivi 29: | Rivi 27: | ||
tulostaisi kaikki rivit, joilla esiintyy sana "linux". | 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 | awk -f skripti.awk tiedosto.txt | ||
tai | tai | ||
Rivi 36: | Rivi 34: | ||
== Kenttien käsittely == | == 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 | Tutkitaan esimerkiksi tiedostoa [[Passwd-tiedosto|/etc/passwd]] josta löytyy tietokoneen käyttäjien käyttäjätunnukset. Tämä tiedosto on muotoa | ||
Rivi 44: | Rivi 42: | ||
bin:x:2:2:bin:/bin:/bin/sh | bin:x:2:2:bin:/bin:/bin/sh | ||
</pre> | </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 | 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 | Määritellään ensin erotinmerkiksi kaksoispiste asettamalla se muuttujan FS komennolla | ||
Rivi 57: | Rivi 55: | ||
== BEGIN- ja END-lohkot == | == BEGIN- ja END-lohkot == | ||
== Ehtolauseet ja vertailut == | == Ehtolauseet ja vertailut == | ||
== Printf == | == Printf == | ||
== Silmukat == | == Silmukat == | ||
== Muuttujat == | == Muuttujat == | ||
== Taulukot == | == Taulukot == | ||
== | == Esimerkejä == | ||
Tiedostoa data.txt, jonka sisältö on seuraava: | Tiedostoa data.txt, jonka sisältö on seuraava: | ||
Rivi 205: | Rivi 74: | ||
käsitellään seuraavanlaisen awk-ohjelman avulla: | 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 aluksi kerran | # tämä begin-lohko ajetaan aluksi kerran | ||
Rivi 223: | Rivi 93: | ||
Kun tiedosto data.txt syötetään ylläkuvatulle awk-ohjelmalle komennolla | Kun tiedosto data.txt syötetään ylläkuvatulle awk-ohjelmalle komennolla | ||
awk -f apu.awk <data.txt> | awk -f apu.awk <data.txt> | ||
on tulos seuraava: | on tulos seuraava: | ||
alkutemput | alkutemput | ||
---------- | ---------- | ||
Rivi 236: | Rivi 108: | ||
Seuraavalla komennolla etsitään 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}' | ||
== Muuta == | == 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-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== | ==Aiheesta muualla== | ||
*[http://www.unix.se/ | *[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 | *[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]] |