Ero sivun ”Awk” versioiden välillä
Siirry navigaatioon
Siirry hakuun
→Johdanto: typo |
p →Johdanto: Syntaksi korjattu. |
||
| (5 välissä olevaa versiota 4 käyttäjän tekeminä ei näytetä) | |||
| 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: | {{DISPLAYTITLE:{{lcfirst:{{PAGENAME}}}}}} | ||
'''awk'''-työkalun avulla voi helposti muuntaa tekstitiedoston rakennetta. awk ja sen laajennettu versio gawk (''GNU awk'') 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 | ||
| Rivi 5: | Rivi 6: | ||
== 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 AT&T:n tutkimuslaboratoriossa (''[[Bell Labs]]''). Samassa paikassa aloitettiin muutama vuosi aikaisemmin myös [[Unix]]in kehittäminen. | |||
Nykyaikaisia awkin toteutuksia ovat mm. gawk ja mawk. | |||
awk:n tilalla on monesti käytetty [[Perl]]iä tai [[Python]]ia, 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- tai Python-tulkki ei | ||
*[http://pubs.opengroup.org/onlinepubs/009695399/utilities/awk.html IEEE:n Unix-standardi] määrittelee | *[http://pubs.opengroup.org/onlinepubs/009695399/utilities/awk.html IEEE:n Unix-standardi] määrittelee awk:n melko kattavasti, kun taas Perlin ja Pythonin parametrit ja syntaksi ovat eläneet päätoteutuksen mukana | ||
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 Perl- tai Python-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 28: | Rivi 30: | ||
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 35: | Rivi 37: | ||
== 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 43: | Rivi 45: | ||
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 56: | Rivi 58: | ||
== BEGIN- ja END-lohkot == | == BEGIN- ja END-lohkot == | ||
awk käsittelee syötteensä [[grep]]in ja [[sed]]in tavoin rivi kerrallaan. BEGIN- ja END-lohkoissa suoritetaan asiat, jotka on kuitenkin tarkoitus tehdä suoritusaikana vain kerran ennen ja jälkeen varsinaisen syötteen käsittelyä. | |||
awk 'BEGIN {aluksi} lauseke1 {jokaiselle lauseke1:lle} \ | awk 'BEGIN {aluksi} lauseke1 {jokaiselle lauseke1:lle} \ | ||
lauseke2 ... END {lopuksi}' tiedosto | lauseke2 ... END {lopuksi}' tiedosto | ||
| Rivi 108: | Rivi 110: | ||
== Muuttujat == | == Muuttujat == | ||
Shell-muuttujia voi välittää | Shell-muuttujia voi välittää awk:lle luettelemalla ne parametreissa. Luvun 12 tulostus: | ||
a=12 | a=12 | ||
echo '\n' | awk -v a=$a 'END {print a}' | echo '\n' | awk -v a=$a 'END {print a}' | ||
| Rivi 191: | Rivi 193: | ||
|- | |- | ||
|system(exp) | |system(exp) | ||
|Komento | |Komento awk:n ulkopuolelle. | ||
|} | |} | ||
| Rivi 242: | Rivi 244: | ||
== 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/Awk Awk-artikkeli] unix.se-wikissä (ruotsiksi), josta tämä artikkeli on osittain käännetty. [[Keskustelu:Awk|Lisätietoja]]. | *[https://web.archive.org/web/20100818142919/http://www.unix.se/Awk Awk-artikkeli] unix.se-wikissä (ruotsiksi), josta tämä artikkeli on osittain käännetty. [[Keskustelu:Awk|Lisätietoja]]. | ||
*[http://www.cs.uu.nl/~piet/docs/nawk/nawk_toc.html | *[https://www.grymoire.com/Unix/Awk.html Eräs AWK-tutoriaali] | ||
*[ | *[https://web.archive.org/web/20070629084417/http://www.cs.uu.nl/~piet/docs/nawk/nawk_toc.html Eräs awk-opas] | ||
*[https://www.gnu.org/software/gawk/manual/html_node/index.html GAWKin manuaali] | |||
*[http://www.pement.org/awk/awk1line.txt Havainnollistavia yksirivisiä] | *[http://www.pement.org/awk/awk1line.txt Havainnollistavia yksirivisiä] | ||
*[https://www.awk.dev The AWK Programming Language, Second Edition -kirjan kotisivut] | |||
*[https://www.oreilly.com/library/view/sed-awk/1565922255/ sed & awk, 2nd Edition -kirjan kotisivut] | |||
*[https://www.skeeve.com/awk-sys-prog.html AWK As A Major Systems Programming Language - Arnold Robbins] | |||
*[https://web.archive.org/web/20140620164850/http://www.cs.wustl.edu/~loui/sigplan Why GAWK for AI? - Ronald P. Loui] | |||
[[Luokka:Komentorivin perustyökalut]] | [[Luokka:Komentorivin perustyökalut]] | ||
{{Ohjelmointikielet}} | |||