Awk: Difference between revisions

From ICO wiki
Jump to navigationJump to search
No edit summary
No edit summary
Line 90: Line 90:
=== Standardmuutujad ===
=== Standardmuutujad ===


Gitosis on pythonil baseeruv programm, mis oskab hallata git repositooriumeid. Kõigepealt veendume, kas python setup tool’s on paigaldatud.
AWKi sisseehitatud ehk standardsete muutujate hulka kuuluvad väljamuutujad $1, $2, $3 ja nii edasi ($0 tähistab tervet rida). Nad tagastavad välja väärtuse või väljal oleva teksti käesolevast reast.


    sudo apt-get install python-setuptools
On veel teisigi standardmuutujaid:
*NR sisaldab käsiloleva sisendist loetud tekstirea (sisendirea) järjekorranumbri.
*NF sisaldab sisendireas olevate sõnade arvu. Tekstirea viimasele väljale saab viidata muutujaga $NF.
*FILENAME sisaldab käsiloleva sisendfaili nime.
*FS sisaldab väljaeraldaja sümboli, mida kasutatakse väljade eraldajana sisendfailis. Väljaeraldaja vaikeväärtus on suvaline arv tühikuid või tabulaatorivajutusi. FS-i väärtust saab muuta vastavalt väljaeraldajale sisendfailis.
*RS sisaldab kirjeeraldaja. Kuna vaikimisi on iga sisendrida eraldi kirje, siis vaikimisi on kirjeeraldajaks reavahetuse sümbol.
*OFS sisaldab väljundi väljaeraldaja. Vaikimisi on OFS väärtuseks tühik.
*ORS sisaldab väljundi kirjeeraldaja. Vaikimisi on ORS väärtuseks reavahetuse sümbol.
*OFMT sisaldab numbrilise väljundi vormingu. Vaikimisi vorming on "%.6g".


Nüüd sikutame gitosise, kloonides ta originaalpaigast uude töökohta (../src). Peale seda installeerime.
===Muutujad ja süntaks===


    cd ~ && mkdir src && cd src
Muutujanimed võivad sisaldada kõiki ladina suur- ja väiketähti, numbreid ja allkriipsu, kuid muutujanimena ei tohi kasutada AWKi võtmesõna|võtmesõnu.
    git clone git://eagain.net/gitosis.git
    cd gitosis
    python setup.py install


Järgmiseks tekitame git kasutaja, kes saab manageerida repositooriume.
Tehtemärgid +, -, *  ja / tähistavad vastavalt liitmist, lahutamist, korrutamist ja jagamist. Sõnede liitmiseks (sidurdamiseks) tuleb kaks muutujat või sõnekonstanti teineteise järele kirjutada. Sõnekonstantide vahelt tohib tühiku ära jätta, kuid kahe muutuja liitmisel tuleb nende vahele kindlasti tühik kirjutada. Sõnekonstante eraldatakse ja tähistatakse jutumärgid|jutumärkidega.


    sudo adduser \
Programmilausete lõppu ei pea panema semikoolonit.
    --system \
    --shell /bin/sh \
    --gecos 'git version control' \
    --group \
    --disabled-password \
    --home /home/git \
    git


Kui kõik hästi läheb siis on tulemus midagi sarnast:
Kommentaare võib programmi lisada, kasutades #-märki rea alguses.
    Adding system user `git'...
    Adding new group `git' (211).
    Adding new user `git' (211) with group `git'.
    Creating home directory `/home/git'.


Jätkamiseks on meil vaja avalikku SSH võtit.
===Kasutaja defineeritud funktsioonid===


    ssh-keygen -t rsa
Funktsioone defineeritakse nagu C-keeles. Funktsiooni definitsioon koosneb võtmesõnast <tt>function</tt>, funktsiooni nimest, argumentide nimedest ja funktsiooni kehast ehk sisust. Järgneb funkstiooni näide.


Avalik võti peab olema $HOME/.ssh/id_rsa.pub. Kopeeri see serverisse, näiteks SCP-ga, vms, (soovitavalt näiteks kataloogi /tmp, kuna sellisel juhul ei teki õiguste probleeme), kus jookseb Gitosis, ning lisa see authorized keys listi.
  function lisa_kolm (number) {
  return number +3
}


    sudo -H -u git gitosis-init < /tmp/id_rsa.pub
Selle funktsiooni väljakutsumiseks sobib käsk
; print lisa_kolm(36),
mis väljastab '''39'''.


Õnnestumise korral annab sellise teate:
Funktsioonides saavad olla kohalikud muutujad. Nende nimed lisatakse parameetrite loendi lõppu, kuid neid ei ole tarvis funktsiooni väljakutsumisel väärtustada. Tavaks on lisada argumentide loendisse enne kohalikke muutujaid rohkem tühikuid, et märkida kohta, kus argumendid lõpevad ja kohalikud muutujad algavad.


    Initialized empty Git repository in ./
Funktsiooni definitsioonis võivad olla liigsed tühikud funktsiooni nime ja algussulu vahel, kuid funktsiooni väljakutses ei tohi liigseid tühikuid olla.
    Initialized empty Git repository in ./


Järgnevalt kontrollime konfiguratsiooni ja muudame seda pisut:
==Lihtsad rakendused==
===Hello world===


    git clone git@YOUR_SERVER_HOSTNAME:gitosis-admin.git
Programm "Hello world|Tere, maailm!" kirjutatatakse AWKis nii:
    cd gitosis-admin
; BEGIN { print "Tere, maailm!" }
    sudoedit gitosis.conf


Võib lisada vabalt valitud gruppe, kes saavad lugeda/kirjutada repositooriumis. Praegusel juhul, kirjeldame uue projekti, ning anname kasutajale selles grupis õigused.
Siin ei ole vaja ilmset <tt>exit</tt>-käsku, kuna ainus muster on <tt>BEGIN</tt>, ühtegi käsurea argumenti ei töödelda.


    [group test]
=== Pikemate kui 80 sümboli pikkuste ridade väljastamine ===
    members = user@email.com
    writeable = test_project
    daemon = yes


Kui fail on salvestatud ja repositooriumiga ühendatud, siis...
Järgmist käsku kasutatakse 80 sümbolist pikemate ridade väljastamiseks. Vaikimisi väljastatakse käesolev rida.
; length($0) > 80


    commit -a -m "Added group test and test_project in group test."
=== Sisendist loetud sõnade arvu väljastamine ===


...siis Gitosis tekitab automaatselt uue repositooriumi. Viimane parameeter ’daemon’ näitab, et git-daemon võib vabalt kuvada käesolevat repositooriumit. Võib testida:
Loendada sisendist tulevaid sõnu ning väljastada ridade, sõnade ja sümbolite arv (nagu "wc" ehk "''word count''" käsk UNIXis):


    sudo -u git git-daemon --base-path=/home/git/repositories/ --export-all
{
    w += NF
    c += length + 1
}
END { print NR, w, c }


Nüüd peaks sul olema võimalik ligi pääseda oma lokaalsest masinast, näiteks kloonides projekti.
Kuna programmi esimeses reas pole antud mustrit, siis vaikimisi sobib iga sisendrida ja järgnevad käsud täidetakse kõikidel ridadel.


<tt>w += NF</tt> on lühendatud variant ja tähendab sama mis <tt>w = w + NF</tt>.


=== Viimaste sõnade liitmine ===


'''Git-daemoni konfigureerimine Ubuntus'''
{ s += $NF }
END { print s + 0 }


    sudo apt-get install git-daemon-run
s-i suurendatakse NF-i võrra, mis on sisendirea viimase sõna (välja) järjekorranumber selles reas. Näiteks $4 tähistab 4. välja väärtust, siis $NF tähistab viimast välja olenemata sellest, mitu välja reas on (võib olla nii rohkem kui vähem kui eelnevates/järgnevates ridades). Dollarimärk $ on unaarne tehtemärk kõrgeima prioriteediga. Kui sisendreas pole ühtegi välja, siis NF väärtus on 0 ning $0, mis tähistab tervet rida, on tühi ja selle väärtus on samuti 0.
    sudo runsvdir /etc/service &
    sudo vi /etc/sv/git-daemon/run
    -> changed the exec line to look like this:
    -> exec git-daemon --verbose --base-path=/var/git
    sudo /etc/init.d/git-daemon-run start
    touch /var/git/myrepo.git/git-daemon-export-ok
    git clone git://my-box/myrepo.git myrepo


Nüüd peaksid saama teha tööd oma git serveris aadressil git://sinuserver/sinu_repositoorium.git
Pärast kogu sisendi lugemist sobitub END-muster ja seejärel väljastatakse s. Kuid sisendis ei pruukinud olla ühtegi rida, mis tähendab, et s ei väärtustunud ja seega s väärtus on tühi sõne. Nulli liitmine muutuja väärtusele on AWKi eripära sõne numbriliseks muutmiseks. Tühja sõne ja muutujate liitmist kasutatakse numbrilise väärtuse sõneks muutmiseks, näiteks s "". Sõnede liitmiseks pole operaatorit vaja, nad asetatakse lihtsalt järjest. Nulli liitmise tõttu väljastab programm 0, vastasel juhul oleks väljastatud tühi rida.


----
----

Revision as of 11:36, 1 May 2010

Sissejuhatus:

AWK on Belli laboris 1977 välja töötatud programmeerimiskeel, mis on loodud tekstitöötluseks. AWK-s võetakse sisendandmed kas tekstifailist või standardsisendist.

Keele nimi "AWK" on tuletatud keele autorite perekonnanimedest Alfred Aho, Peter Weinberger ja Brian Kernighan, kuid tavaliselt seda ei hääldata nagu tähtede järjendit (A-W-K), vaid pigem [ook] nagu alk, mis on inglise keeles auk. Alk on ka AWK vapilind, näiteks raamatu "The AWK Programming Language" kaanel - sellele raamatule viidatakse tihti, kasutades lühendit TAPL). Väiketähtedes kirjutatuna viitab awk UNIXis või Plan 9-s kirjutatud programmile, mis jooksutab teisi AWKis kirjutatud programme. AWKis kirjutatud arvutiprogrammi käivitamiseks UNIXi käsurealt tuleb AWK-programmi nime ette kirjutada käsk awk).

"AWK on tekstifailide töötlemise keel. Faili käsitletakse kirjete jadana ja vaikimisi on iga rida eraldi kirje. Iga rida jagatakse omakorda väljadeks, mis tähendab, et rea esimene sõna on esimene väli, rea teine sõna teine väli ja nii edasi. AWKi programm koosneb muster-käsklausetest. AWKi programm loeb sisendit reakaupa. Sisse loetud rida võrreldakse programmis iga mustriga ja iga sobiva mustri korral täidetakse mustrile järgnev käsk." - Alfred Aho[1]

AWK on näide programmeerimiskeelest, mis kasutab laialdaselt sõne andmetüüpi ja regulaaravaldisi. Algse AWKi võimsus, lakoonilisus ja piirangud inspireerisid Larry Walli kirjutama Perli. Samas defineeriti AWKi võimsamad variandid POSIX AWK ja gawk (GNU AWK). Kuigi AWK ja sed projekteeriti algselt üherealiste programmide loomiseks, kirjutati isegi Belli laborites suuri ja hästi struktureeritud AWKi programme.

AWK oli üks väheseid vahendeid, mis oli saadav UNIXi seitsmendas versioonis ja kogus populaarsust UNIXi "torule" (pipeline) arvutuslike lisavõimaluste lisamise vahendina. Peaaegu igale moodsale UNIXi-laadsele operatsioonisüsteemile on sisse ehitatud mingisugune AWKi versioon. AWKi peetakse UNIXi-laadse operatsioonisüsteemi kohustuslikuks osaks. Lisaks Bourne'i shellile on AWK ainus standardses UNIXi keskkonnas kättesaadav skriptimiskeel.


Artikli autor ja logi

Nimi: Reigo Savolainen
Grupp: AK31
Viimati muudetud: 01.05.2010

Versioon Lisatud   Kommentaar
0.1 26.04.2010     Artikli loomine
0.1.1 01.05.2010     Esialgne sisu sisestus
0.1.2 01.05.2010     Artikli täiendamine
0.1.3 01.05.2010     Valmis



AWKi programmide struktuur

AWKi programm on muster-tegevus-paaride seeria, mis on kirjutatud kujul

   muster { tegevus },

kus muster on tavaliselt avaldis ja tegevus on käskude jada.

Iga sisendirida võrreldakse kõikide mustritega järgemööda ja tegevus täidetakse iga mustri kohta, mille avaldis on tõene.

Nii mustri kui ka tegevuse võib ära jätta. Mustri puudumisel sobib iga sisendrida. Vaikimisi tegevus on sisendirea väljastamine standardväljundisse.

Lisaks lihtsale AWKi avaldisele võib muster olla ka BEGIN või END, mille tulemusel täidetakse tegevus vastavalt kas enne või pärast sisendist kõikide ridade lugemist, või muster1, muster2, mis võtab terve hulga sisendridasid alates reast, mis sobitub muster1ga, kuni reani, mis sobitub muster2ga, enne kui võrdleb järjekordset sisendirida muster1ga.

Lisaks tavalistele aritmeetika ja loogika tehtemärkidele on AWKi avaldistes ka tilde-tehtemärk ~, mis võrdleb regulaaravaldist sõnega. Kasuliku süntaktilise suhkruna võrdleb /regexp/ (regulaaravaldis) ilma tilde-tehtemärgita käesoleva sisendreaga.



AWKi käsud

AWKi käsud on laused, mis tohivad eelnevates näidetes olla tegevuse asemel. AWKi käskudeks on funktsioon (programmeerimine)|funktsioonide väljakutsed, muutujate väärtustamine, arvutused ja eelnevate kombinatsioonid. AWKi on sisse ehitatud mitme funktsiooni tugi ja AWKi eri versioonid pakuvad neile rikkalikku lisa.

Lihtsuse huvides on järgnevates näidetes ära jäetud looksulud.

print-käsk

print-käsku kasutatakse teksti väljastamiseks. Väljastatav tekst on määratletud eeldefineeritud stringiga, mille nimetus on ORS (output record separator - väljundkirje eraldaja) ja vaikeväärtus eks reavahetus. print-käsu lihtsaim vorm on:

print

See kuvab käesoleva rea. AWKis on read jagatud väljadeks ja neid saab eraldi kuvada.

print $1

kuvab käsiloleva rea esimese välja.

print $1, $3

kuvab käsiloleva rea esimese ja kolmanda välja, mis on omavahel eraldatud väljundvälja eraldajaga (OFS - output field separator), mille vaikeväärtuseks on üks tühik.

Kuigi need väljad ($X) sarnanevad muutujatele (dollarimärk "$" viitab Perlis muutujale), märgivad nad tegelikult välju käesolevas reas. Erijuht $0 viitab tervele reale. Käsud "print" ja "print $0" on võrdväärsed.

print-käsku võib kasutada ka arvutuste ja funktsioonide tulemuste kuvamiseks:

print 3+2
print omafunktsioon(3)
print omafunktsioon(muutuja)
print sin(3-2)

Väljundi saab suunata faili:

print "avaldis" > "failinimi"

või UNIXi "toru" kasutades:

print "avaldis" | "käsk"

Standardmuutujad

AWKi sisseehitatud ehk standardsete muutujate hulka kuuluvad väljamuutujad $1, $2, $3 ja nii edasi ($0 tähistab tervet rida). Nad tagastavad välja väärtuse või väljal oleva teksti käesolevast reast.

On veel teisigi standardmuutujaid:

  • NR sisaldab käsiloleva sisendist loetud tekstirea (sisendirea) järjekorranumbri.
  • NF sisaldab sisendireas olevate sõnade arvu. Tekstirea viimasele väljale saab viidata muutujaga $NF.
  • FILENAME sisaldab käsiloleva sisendfaili nime.
  • FS sisaldab väljaeraldaja sümboli, mida kasutatakse väljade eraldajana sisendfailis. Väljaeraldaja vaikeväärtus on suvaline arv tühikuid või tabulaatorivajutusi. FS-i väärtust saab muuta vastavalt väljaeraldajale sisendfailis.
  • RS sisaldab kirjeeraldaja. Kuna vaikimisi on iga sisendrida eraldi kirje, siis vaikimisi on kirjeeraldajaks reavahetuse sümbol.
  • OFS sisaldab väljundi väljaeraldaja. Vaikimisi on OFS väärtuseks tühik.
  • ORS sisaldab väljundi kirjeeraldaja. Vaikimisi on ORS väärtuseks reavahetuse sümbol.
  • OFMT sisaldab numbrilise väljundi vormingu. Vaikimisi vorming on "%.6g".

Muutujad ja süntaks

Muutujanimed võivad sisaldada kõiki ladina suur- ja väiketähti, numbreid ja allkriipsu, kuid muutujanimena ei tohi kasutada AWKi võtmesõna|võtmesõnu.

Tehtemärgid +, -, * ja / tähistavad vastavalt liitmist, lahutamist, korrutamist ja jagamist. Sõnede liitmiseks (sidurdamiseks) tuleb kaks muutujat või sõnekonstanti teineteise järele kirjutada. Sõnekonstantide vahelt tohib tühiku ära jätta, kuid kahe muutuja liitmisel tuleb nende vahele kindlasti tühik kirjutada. Sõnekonstante eraldatakse ja tähistatakse jutumärgid|jutumärkidega.

Programmilausete lõppu ei pea panema semikoolonit.

Kommentaare võib programmi lisada, kasutades #-märki rea alguses.

Kasutaja defineeritud funktsioonid

Funktsioone defineeritakse nagu C-keeles. Funktsiooni definitsioon koosneb võtmesõnast function, funktsiooni nimest, argumentide nimedest ja funktsiooni kehast ehk sisust. Järgneb funkstiooni näide.

function lisa_kolm (number) {
  return number +3
}

Selle funktsiooni väljakutsumiseks sobib käsk

print lisa_kolm(36),

mis väljastab 39.

Funktsioonides saavad olla kohalikud muutujad. Nende nimed lisatakse parameetrite loendi lõppu, kuid neid ei ole tarvis funktsiooni väljakutsumisel väärtustada. Tavaks on lisada argumentide loendisse enne kohalikke muutujaid rohkem tühikuid, et märkida kohta, kus argumendid lõpevad ja kohalikud muutujad algavad.

Funktsiooni definitsioonis võivad olla liigsed tühikud funktsiooni nime ja algussulu vahel, kuid funktsiooni väljakutses ei tohi liigseid tühikuid olla.

Lihtsad rakendused

Hello world

Programm "Hello world|Tere, maailm!" kirjutatatakse AWKis nii:

BEGIN { print "Tere, maailm!" }

Siin ei ole vaja ilmset exit-käsku, kuna ainus muster on BEGIN, ühtegi käsurea argumenti ei töödelda.

Pikemate kui 80 sümboli pikkuste ridade väljastamine

Järgmist käsku kasutatakse 80 sümbolist pikemate ridade väljastamiseks. Vaikimisi väljastatakse käesolev rida.

length($0) > 80

Sisendist loetud sõnade arvu väljastamine

Loendada sisendist tulevaid sõnu ning väljastada ridade, sõnade ja sümbolite arv (nagu "wc" ehk "word count" käsk UNIXis):

{
    w += NF
    c += length + 1
}
END { print NR, w, c }

Kuna programmi esimeses reas pole antud mustrit, siis vaikimisi sobib iga sisendrida ja järgnevad käsud täidetakse kõikidel ridadel.

w += NF on lühendatud variant ja tähendab sama mis w = w + NF.

Viimaste sõnade liitmine

{ s += $NF }
END { print s + 0 }

s-i suurendatakse NF-i võrra, mis on sisendirea viimase sõna (välja) järjekorranumber selles reas. Näiteks $4 tähistab 4. välja väärtust, siis $NF tähistab viimast välja olenemata sellest, mitu välja reas on (võib olla nii rohkem kui vähem kui eelnevates/järgnevates ridades). Dollarimärk $ on unaarne tehtemärk kõrgeima prioriteediga. Kui sisendreas pole ühtegi välja, siis NF väärtus on 0 ning $0, mis tähistab tervet rida, on tühi ja selle väärtus on samuti 0.

Pärast kogu sisendi lugemist sobitub END-muster ja seejärel väljastatakse s. Kuid sisendis ei pruukinud olla ühtegi rida, mis tähendab, et s ei väärtustunud ja seega s väärtus on tühi sõne. Nulli liitmine muutuja väärtusele on AWKi eripära sõne numbriliseks muutmiseks. Tühja sõne ja muutujate liitmist kasutatakse numbrilise väärtuse sõneks muutmiseks, näiteks s "". Sõnede liitmiseks pole operaatorit vaja, nad asetatakse lihtsalt järjest. Nulli liitmise tõttu väljastab programm 0, vastasel juhul oleks väljastatud tühi rida.


Lingid

   http://book.git-scm.com/
   http://git.wiki.kernel.org/index.php/GitLinks
   http://progit.org/book/
   http://jonas.nitro.dk/git/quick-reference.html
   http://www.youtube.com/watch?v=4XpnKHJAok8

--Rsavolai 13:20, 30 January 2010 (EET)