You are on page 1of 17

Opercis rendszerek I.

- UNIX felhasznli ismeretek s hjprogramozs

Az awk
1. Bevezet...........................................................................................................................................1 2. Rekordok s mezk .........................................................................................................................2 3. Az awk programozsi nyelv ............................................................................................................3 Az awk minta ..................................................................................................................................3 Az utastsok .......................................................................................................................................4 A vltozk............................................................................................................................................5 Bels vltozk .....................................................................................................................................5 Konstansok...........................................................................................................................................6 Opertorok............................................................................................................................................7 Programszervez utastsok ................................................................................................................8 Fggvnyek..........................................................................................................................................9 A fontosabb numerikus fggvnyek................................................................................................9 Fontosabb sztring fggvnyek.........................................................................................................9 Fontosabb ki s bemeneti fggvnyek ..........................................................................................10 Egysoros pldaprogramok..................................................................................................................10 Tbb llomny egyidej feldolgozsa s a getline fggvny .......................................................11 Kls parancsok futtatsa...................................................................................................................12 Sajt fggvnyek ...............................................................................................................................12 Tmbk az awk-ban...........................................................................................................................13 Tmbk ltrehozsa a split fggvnnyel.......................................................................................16 Tbbdimenzis tmbk.................................................................................................................16 Bibliogrfia.........................................................................................................................................17

1. Bevezet
Az awk egy programozsi nyelv, szerzi "awk, a pattern scanning and processing language": minta elemz s feldolgoz nyelv nevet adtk neki. A nyelv tulajdonkppen brmilyen felpts szvegbl mintk alapjn sorokat vagy mezket tud kiemelni, s azokkal mveleteket tud vgezni. gy akr a UNIX programok kimenett (pl. az ls -l parancs kimenett) akr adatokat tartalmaz mezkre bonthat llomnyok (pl. a .csv tpus llomnyok) soraibl ki lehet vele hmozni a re bzott feladat megoldshoz szksges mezket. Ezekkel klnbz matematikai illetve szveges mveleteket tud vgezni. A nyelv programozsi szerkezetei a C nyelv utastsaira plnek. Nevt a szerzk nevnek kezdbetibl lltottk ssze: Aho Weinberger Kernighan. Az awk rendkvli mdon megknnyti a szveges llomnyok feldolgozst. A mrnki munkban nyers adatok el feldolgozst vgezhetjk vele knnyen. A UNIX/Linux alatti rendszerprogramozsban a parancsok kimenett (pl. az ls -l parancs szveges kimenett) dolgozhatjuk fel knnyen. Mivel szkript nyelv s igen tmr, kis mindennapi feladatok megoldst vgezhetjk el vele gyorsan. A nyelv szerzi nem ajnljk a nyelvet nagy s bonyolult feladatok megoldshoz: ennek ellenre, elg sok tpus feladatot lehet vele megoldani, klnsen azokat, amelyek rendszerprogramozshoz kzeliek, s pl. vals szmokkal is kell szmolni. A segdlet az awk fontosabb elemeit mutatja be. Kimert tanulmnyozshoz a felhasznli kziknyv vagy egyb dokumentcik tanulmnyozsa szksges (bibliogrfia a dokumentum vgn. A felhasznli kziknyvnek van magyar fordtsa). Ebben a rvid bemutatban a hangsly a feldolgozprogram elvnek megrtsn van. Az awk-nak tbb vltozata van, az albbiak a GNU 1

Opercis rendszerek I. - UNIX felhasznli ismeretek s hjprogramozs

awk-ra rvnyesek Linux alatt. A program indtsa hasonl a sed -hez, a program vgigolvassa a bemenett (a standard input jelenti az implicit bemenetet), feldolgozza azt s a kimenetre r. A -f kapcsol ugyangy a szkript llomnyra hivatkozik, de a szkript megjelenhet az els paramterben is idzjelek kztt. Az ltalunk hasznlt kapcsolk: Field separator: megllaptja a mezelvlaszt karaktert. Ha nem adjuk meg, akkor az implicit elvlaszt a szkz s a TAB, illetve ezek ismtldse (tulajdonkppen egy regulris kifejezs minta: [ \t]+ .
-F c -f file a szkript llomny megadsa -v var=val a var vltoznak val rtket ad induls eltt

Az awk nyelven rt hosszabb programokat rhatjuk


#!/usr/bin/awk -f

sorral kezdden kln llomnyba, melynek j ha a .awk kiterjesztst adjuk megklnbztets vgett.

2. Rekordok s mezk
Mkdsi elv Az awk a kvetkez feldolgozst alkalmazza a bemeneti sorokra: gy tekinti a sorokat, mint egy elvlaszt karakterrel (vagy karakter szekvencival) hatrolt, mezkbl ll sor. Egy sornak a neve rekord (ez a feldolgozsi egysg). Pl. az albbi sor (vagy rekord) esetn:
112 LinkinPark Numb numb.txt 35

a sornak 5 mezje van, az elvlaszt egy szkz. A sor feldolgozsa kzben a nyelv a mezkre a $1, $2, ... vltozkkal hivatkozik. Pl. a $3 rtke Numb . A teljes sorra a $0 vltozval lehet hivatkozni. Ugyanakkor a mezkre az albbi szerkezet vltozkon keresztl is lehet hivatkozni, a:
k=3 print $k

a harmadik mez rtkt fogja kinyomtatni (lsd albb hogyan definiljuk a vltozkat). A sorok szmt az awk az NR (Number of Rows - az sszes eddig beolvasott sor) s FNR (az aktulis bemeneti llomny, ha tbb van) vltozkban kveti. A mezk szma az FN vltozban van, amely az utols mez cmzsre is hasznlhat: $FN. Az albbi plda:
print $FN

az utols mezt nyomtatja, fggetlenl attl, hogy hny van. A mezk cmzsre kifejezsek is hasznlhatak:
print $(2+2)

a negyedik mezt fogja nyomtatni. Hasznlat kzben az awk ltal ellltott mezknek meg lehet vltoztatni az rtkt:
echo 'a b' | awk '{$1="b"; print $0}'

Opercis rendszerek I. - UNIX felhasznli ismeretek s hjprogramozs

3. Az awk programozsi nyelv


Az awk programsorok szablyokbl llanak: egy szably egy mintbl (pattern) s a hozz tartoz tevkenysgbl (action) vagy utastsokbl (statement) ll, amely {} kz zrt blokkban van:
minta {utastsok}

A {} blokkban utastsok kvetik egymst. Az awk fggvnyei kzl a legegyszerbb a print : kinyomtatja a $0 vltoz tartalmt egy sort.
{print}

Ha argumentumokkal hasznljuk, a print fggvny a felsorolt vltozkat kirja a kimenetre.


$ echo '112 LinkinPark Numb numb.txt 35' | awk '{print $1, $4}' 112 numb.txt

Akr a sed, normlis menetben az awk egy-egy sort olvas a $0 vltozba, feldolgozza azt: azaz alkalmazza re szablyait ha a szablyhoz rendelt cm kivlassza a sort. Ezt a mveletet ismtli amg a bemenetrl elfogynak a sorok. Az awk minti bvtett regulris kifejezseket hasznlnak, pl. a:
/^a/

azokat a sorokat fogja kivlasztani amelyek 'a' -val kezddnek. Az awk szablyban a mintnak vagy tevkenysgnek meg kell jelennie. Ha a minta elmarad, a tevkenysget minden bemeneti sorra alkalmazza az awk, ha a tevkenysg marad el, akkor az implicit tevkenysg a print $0 , azaz a bemeneti sor nyomtatsa. gy:
$ echo alma | awk '/^a/{print $0}' alma

kinyomtatja az egyetlen bemeneti sort, mert a minta illeszkedik a sorra,


$ echo alma | awk '/^a/' alma

ugyanazt teszi, mert elhagytuk a tevkenysget. Ugyanakkor:


$ echo alma | awk '{print $0}' alma

is kinyomtatja a bemeneti sort, mert nincs minta, teht minden sorra illeszkedik.

Az awk minta
A minta felptse bonyolultabb mint a sed ltal hasznlt. Az albbi tblzat tartalmazza lehetsges felptst: Mintk
BEGIN END

Feldolgozs A BEGIN s END specilisak: az utnuk kvetkez utastsokat a sorok feldolgozsa eltt (BEGIN) illetve minden sor feldolgozsa utn (END) hajtja vgre az awk, egyetlen egyszer. Ezek a program elkszt utastsai (pl. vltozk kezdeti rtknek megadsa) illetve befejez utastsai (pl. vgs eredmny nyomtatsa). 3

Opercis rendszerek I. - UNIX felhasznli ismeretek s hjprogramozs

Mintk

Feldolgozs A program futtathat bemenet nlkl is, ha csak a BEGIN mintt hasznljuk. Ilyenkor vgrehajtja utastsait s utna kilp.

/regex/

Regulris kifejezs: a awk bvtett (extended) kifejezseket hasznl, ugyanazokat mint az egrep. Nincs teht szksg kln kapcsolra, hogy ezt bejelljk. 2 minta s, vagy illetve nem logikai relcijbl kpzett felttel. Az && esetben pl. mindkt mintnak illeszkednie kell a feldolgozand sorra, az || esetben csak az egyiknek. A ! -al jellt mintk esetben a blokk csak akkor hajtdik vgre, ha a minta nem vlassza ki a sort. tartomny cmzse kt mintval A C-hez hasonl feltteles teszt. Ha a minta tall, akkor a minta1 teszt lesz dnt, ha nem akkor a minta2. Az awk vltozira alkalmazott C-szer relcis kifejezs,pl:
$1 > 2

minta && minta minta || minta ! minta minta1, minta2 minta ? minta1 : minta2 relcis kifejezs

teht ha az els mez numerikusan, szmm alaktva nagyobb mint 2, akkor arra a sorra vgrehajtdik az utastssorozat. A kifejezsben a C nyelv relcis kifejezseit lehet hasznlni (>, <, <=, >=, ==, != ). A C nyelvhez kpest van kt opertor ami klnbzik azoktl: a ~ s a ~! (match s no match). Hasznlatuk gy trtnik:
$1 ~ /^a/

jelentse: ha az els mez kis a betvel kezddik, azaz illeszkedik a megadott regulris kifejezsre. A kifejezs akkor vlasztja ki a tevkenysget, ha az rtke 0-tl klnbzik amennyiben vals szmra lehet konvertlni, vagy nem az res sztring amennyiben sztringre. Teht a kifejezseket sztringekre is lehet alkalmazni: ilyenkor az awk karakterenknt hasonltja ssze a sztringeket. ha kt sztring megegyez karakterei ugyanazok, akkor a hosszabbik tekintend nagyobbnak. Pl. "10" kisebb mint "9" , mert els karaktereik sszehasonltsakor a 1 < 9. De 10 nagyobb mint 9: az awk az adattpustl fggen vgzi el az sszehasonltst.

Az utastsok
Az awk nyelv elemei { } zrjelek kz kerlnek s szablyokat hatroznak meg. A C nyelvhez hasonlan, vltoz rtkadst, programszervez utastsokat, kifejezseket tartalmaznak. Az opertorok, utastsok a C-hez hasonlak (a C nyelvet vettk mintnak a tervezsknl). Pl.
{a=2; print a}

Opercis rendszerek I. - UNIX felhasznli ismeretek s hjprogramozs

Az utastsok kzt az elvlaszt az jsor karakter lehet, amennyiben egy sorba tbb kerl akkor a ; . Az awk program 3 rszt tartalmazhat, egy bevezet (BEGIN), egy szvegsoronknt vgrehajthat s egy zr (END) programrszt, teht ltalnosan gy nz ki:
BEGIN {bevezet utastsok} minta { a kivlasztott sorra vgrehajtott utastsok} END {zr utastsok }

A minta {utastasok} szerkezet egyms utn tbbszr is elfordulhat, s ez a rsz ismtldik minden egyes feldolgozott sorra. pl.:
$ echo '1 2'| awk 'BEGIN{a=1} {a=a+$1+$2} END{print a}' 4

Akrcsak a sed esetben a # jel magyarzat beillesztst jelenti a sor vgig.

A vltozk
Az awk vltozneveket ugyangy jelljk mint a C nyelv vltozit. A deklarci pillanatban jnnek ltre s tpusukat nem kell explicit deklarlni (teht nem szksges ket mg csak a BEGIN rszben sem deklarlni), s a krnyezettl fggen lesznek valsak vagy karakterlncok. A szkript nyelvekre jellemzen ezek dinamikus vltozk. A nyelv kt tpussal rendelkezik: vals illetve sztring. Pl.
s="alma" egy sztringet hoz ltre, x=2.2 pedig egy vals vltozt. y=$10 Az y a $10 meztl fggen lesz vals vagy karakterlnc.

Bels vltozk
A program tartalmaz bels vltozkat, ezek mindig ltrejnnek, nem kell ket deklarlni. Kzlk az albbi fontosabbakat fogjuk hasznlni: Vltoz ARGC FILENAME FS Angol neve Mit tartalmaz Implicit rtk

Command line Hny argumentum van az awk parancssorn nincs argument count Filename Input Field Separator A bemeneti llomny neve A bementi mezelvlaszt karakter vagy szkz s karakterek. Az FS regulris kifejezs is tabultor, azaz: lehet, tulajdonkppen az implicit rtk is az, [\t ]+ pontosan: [\t ]+ , teht szkz vagy TAB legalbb egyszer. Ha az FS rtke az res sztring (FS="") akkor a bemenet minden egyes karaktere 5

Opercis rendszerek I. - UNIX felhasznli ismeretek s hjprogramozs

Vltoz RS

Angol neve Record separator

Mit tartalmaz kln meznek szmt. Ez a rekord (azaz bemeneti sor) elvlaszt. Ez is regulris kifejezs, megvltoztathat. Ha nem zr, akkor a regulris kifejezseknl kis nagybet nem szmt. Hny mez van a bemeneti rekordban

Implicit rtk
\n egy jsor

karakter 0 nincs

IGNORECASE Ignore case NF Fields in the current input record

NR

Number of Hnyadik sornl tart a feldolgozs records seen so far The output format for numbers Hogyan formatlja a vals szmokat ha a kimenetre rjuk azokat. Lthat az implicit rtkbl, hogy a formtumokat a C nyelv printf fggvnynek formatl sztringjeivel lltja el. A kimenti mezelvlaszt karakter. A kimenti rekord (azaz sor) elvlaszt karakter. Implicit jsor, akr ms is lehet, amennyiben pedig az res sztring, akkor a kimeneten nem lesznek sztvlasztva a sorok.

nincs

OFMT

"%.6g"

OFS ORS

output field separator output record separator

szkz jsor

Az ARGV illetve ENVIRON vltozk a parancssor argumentumait illetve a krnyezeti vltozkat tartalmazzk s ezek awk tmbk (lsd albb).

Konstansok
Sztring konstansok A sztring konstansok ketts idzjellel krlvett sztringek. A sztringeken bell hasznlhatak a C nyelv escape szekvencival megadott specilis karakterei, a:
\\ backslash \b backspace \f form-feed \n newline - jsor \r carriage return kocsi vissza \t horizontal tab - tabultor \v vertical tab fggleges tabultor \xhex szmjegyek, pl: \xod \c literlisan a c karaktert jelenti, pl.

\? a ? -t

Plda sztring defincikra:


$ echo '' | awk '\{s="abc"; t="def\nitt ujsor jon"}\ END{print s,t}'

Opercis rendszerek I. - UNIX felhasznli ismeretek s hjprogramozs abc def itt ujsor jon

A tzes szmrendszerben, nyolcasban s tizenhatosban megadott konstansokat ugyangy kezeli mint a C nyelv. Pl:
echo '' | awk '{print 10.2,011,0x22}' 10.2 9 34

Opertorok
Az awk a C nyelv opertorait hasznlja, ezek vltozira s konstansaira alkalmazhatk. Az opertorok:
( ) $ ++ -^ + - ! * / % + < > <= >= != == ~ !~ zrjel, csoportost mez referencia, pl.: $1 prefix s postfix inkrementls, pl.: hatvny (** is hasznlhat) + - egyo perandussal, s tagads szorzs, oszts, modul sszeads, kivons relcisak Regulris kifejezs tesztelse (illeszts, match) annak tagadsa. Ha a regulris kifejezs konstans, azt a mvelet jobb oldaln kell hasznlni. pl.: $1 ~ /abc/ logikai S logikai VAGY feltteles teszt hozzrendels s mvelet

i++

&& || ?: = += -= *= /= %= ^=

Az opertorok precedencija s asszociativitsa ugyanaz mint a C-nl. Klnbsgek a C nyelvhez kpest: -a sztringek sszefzsnek opertora a szkz karakter, teht:
{print "a" "b"} ab -t fog kirni

-a nyelv nem rendelkezik a vessz opertorral, teht nem hasznlhatunk ilyen szerkezeteket mint:
a=2, b=5

Pl:
#inkrementls $ echo '' | awk '{i=0; i++; print i}' 1

Opercis rendszerek I. - UNIX felhasznli ismeretek s hjprogramozs

#regulris kifejezs illeszts $ echo '112' | awk '\ {if ($1 ~ /[0-9]+/)\ {print "az elso mezo szamokbol all"}}' az elso mezo szamokbol all $ echo 'abc' | awk '{if ($1 !~ /[0-9]+/)\ {print "az elso mezo nem all szamokbol"}}' az elso mezo nem all szamokbol #pelda sztring sszefzesre $ echo '1 2 3 abc def ' | awk '{print $4 $5}' abcdef

Programszervez utastsok
Ezeket a C nyelvbl klcsnzi az awk, az albbiak hasznlhatak:
if (felttel) utasts [ else utasts ] while (felttel) utasts do utasts while (felttel) for (expr1; expr2; expr3) utasts break continue exit [ kifejezs ] { utasts }

Pl. az if hasznlata:
$ echo '2.2'| awk '{ if ($1==1) {print "igaz"} else\ {print "hamis"}}' hamis

A modern awk nyelv vezrlsi utastsnak tekinti a next utastst (fggvnyt) is (lsd be/ki fggvnyek). A next vgrehajtsakor az awk abbahagyja a kurrens rekord feldolgozst, jat vesz a bemenetrl s jraindtja vele az awk programot. Pl. ha arra szmtunk, hogy a bemenet minden sorban 4 mez van, s nem szeretnnk hibs feldolgozst vgezni, akkor olyan sorok rkezsekor amelyekben nincs 4 mez knnyen kikerlhetjk ezeket:
#!/usr/bin/awk -f { if (NF != 3) { print "Rossz mezszm, sor: " NR " : " $0 next

Opercis rendszerek I. - UNIX felhasznli ismeretek s hjprogramozs } } #... feldolgozsok itt kezddnek

Fggvnyek
A fggvnyeknek 2 kategrija van, a beptett s a felhasznl sajt fggvnyei. A fggvnyek fontosabb csoportjai a numerikus, a sztring s a be/ki fggvnyek.

A fontosabb numerikus fggvnyek


Mindazok a fggvnyek amelyek egy kis tudomnyos kzi szmolgpben megtallhatak, megtallhatak az awk-ban is. A fggvnyeket a C nyelvhez hasonl szintaxissal lehet meghvni. Ezek ismertek a C nyelv standard knyvtrbl, ugyangy kell meghvni ket.
atan2(y, x) # atan x/y -t szmol cos(expr) exp(expr) int(expr) #egsz rszt ad vissza log(expr) sin(expr) sqrt(expr) rand() , srand ( [ szm ] ) #random szm generlsa

Pl.
$ echo '' | awk '{print sin(1)}' 0.841471

Fontosabb sztring fggvnyek


index(hol, mit)

Visszatrti a mit sztring pozcijt az hol sztringben, 0-t ha nincs benne. A sztring indexeket 1-tl szmolja a nyelv. A sztring hosszt trti vissza. Szubsztringet trt vissza az i-edik pozcitl kezdve, legtbb n karaktert. Kisbetss konvertl. Nagybetss konvertl. A C sprintf -jnek megfelel formatl fggvny.

length (s) substr(s, i [, n]) tolower(str) toupper(str) sprintf (format, kifejezs-lista) sub(regex, mivel, [miben])

Az miben sztringben behelyettesti a regex-re illeszked rszt a mivel sztringgel. Ha a miben paramter hinyzik, akkor a $0-ban helyettest. gsub (regex, mivel, A sub egyszer helyettest, a gsub minden tallatot tr. [miben]) Ha a miben paramtert nem adom meg, akkor a $0 -n dolgozik. Sikertelen trs utn 0-val trnek vissza, sikeres utn a sub 1-el, a gsub a cserk szmval. Itt is hasznlhat az & karakter a tallatra val visszautalsknt, akr a 9

Opercis rendszerek I. - UNIX felhasznli ismeretek s hjprogramozs

sed s parancsban.
gensub(regex, mivel,hogyan, [miben])

Ez az ltalnos helyettest fggvny. Ugyangy mkdik mint a sub, de a hogyan mezben meg lehet adni ugyanazokat a kapcsolkat mint a sed helyettestsnl (n: hnyadik tallatot illetve g). Ugyanakkor a mivel sztringen hasznlhatak a \1, \2 stb. visszautalsok. Ez a fggvny a gawk kiterjesztse. Illeszti a regexp-et a sztringre: visszatrt egy szmot, ami 0 ha nincs illeszts illetve egy pozitv egsz szm ha van: ez pontosan az illeszts indexe a sztringben.

match(s,regexp)

Pl.:
$ echo 'elso masodik' | awk '\ {s=substr($2,5,3); s1=sprintf("%s%s", $1,s);\ s2=substr($2,0,4); print s1,s2}' elsodik maso

Fontosabb ki s bemeneti fggvnyek


next

Abbahagyja a kurrens rekord feldolgozst, veszi a kvetkezt. A feldolgozs jraindul az els awk szablytl a BEGIN utn. Vigyzni kell hasznlatnl, pldul az albbi szkript semmit sem nyomtat a bemenetrl:
'{next;print $0}'

print print kifejezs-lista print kifejezs-lista > file printf (fmt, kifejezslista)

kirja a kurrens rekordot (a $0 rtkt) kirja egyms mell a kifejezsek rtkt a kirst llomnyba rja. A > jel ekvivalens a shell ltal hasznlt jellel, akr a >> is hasznlhat A C nyelv printf fggvnynek megfelel fggvny. Rszletes lerst lsd a kziknyvben.

Pl.:
$ echo '12.2261564 94.56256521' | awk '{\ printf("%2.2f %2.4f", $1,$2)}' 12.23 94.5626

A print fggvny nem csak a kimenetre, hanem csvezetkbe, llomnyba is tud rni:
$ echo '' | awk '{print "abc" $ echo '' | awk '{print "abc" close("grep -o 'abc'")}' > "file.txt"}' | "grep -o 'abc'";\

Az awk kimenete tirnythat, akr a shell-:


{print "a" > "szoveg.txt"}

Hasonlan hasznlhat a >> jel is.

10

Opercis rendszerek I. - UNIX felhasznli ismeretek s hjprogramozs

Egysoros pldaprogramok
A book.csv llomny knyvei sszrnak kiszmtsa az awk-val:
$ cat book.csv | awk -F '\t' 'BEGIN{sum=0}{sum=sum+$5}END{print sum}' 21561.6

llomnyok sszmretnek kiszmtsa:


$ ls -l -rw-rw-r-- 1 lszabo lszabo 3 Nov 13 23:59 book6.txt -rw-rw-r-- 1 lszabo lszabo 1794 Nov 14 01:26 hc.txt -rw-rw-r-- 1 lszabo lszabo 920 Nov 14 01:26 numb1.txt $ ls -l *.txt| awk '{ x += $5 }\ END {print "osszes byte-ok szama: " x }' osszes byte-ok szama: 2717

Egy llomny sorainak szmt gy kapom meg:


$ cat szoveg.txt | awk 'END { print NR }' 22

Az res sorok kiszrse egy llomnybl:


$ awk 'NF > 0' szoveg.txt

Tbb llomny egyidej feldolgozsa s a getline fggvny


A getline fggvny hasznlata nem ajnlott kezdknek. Ennek ellenre rviden foglalkozunk vele, mert a fontos lehetsgeit mutatja meg az awk-nak. Rszletek a kziknyvben. getline j sort olvas a bemeneti llomnybl a $0-ba belltja az NF, NRF s NR vltozkat. A visszatrtett rtk: 1 - ha sikerlt olvasni. 0 - llomny vge -1 - hiba getline vltoz j sort olvas a bemenetrl a vltoz vltozba, belltja: NF, NR, FNR vltozkat. Annak ellenre, hogy a getline fggvny, gy kell meghvni mint egy parancsot ( a getline (line) hvs nem mkdik). j sort olvas a file llomnybl a $0-ba belltja az NF vltozt. Ha sikerlt olvasnia, 1 -et trt vissza.
getline sor < "/dev/tty"

getline < file

getline vltoz < file j sort olvas a file llomnybl a vltoz vltozba. A mindig a terminlrl olvas close (file) flush (file)

Olvass utn a bemeneti llomnyt le kell zrni. Kirja a kimeneti llomny puffert, ha azt > vagy >> rssal nyitottuk meg.

Az albbi program beolvassa a words llomny els 3 sort: 11

Opercis rendszerek I. - UNIX felhasznli ismeretek s hjprogramozs BEGIN { sorok=0; while ( sorok < 4 ) { getline < "words" print $0 sorok++ } close("words") }

Kls parancsok futtatsa


parancs | getline parancs | getline vltoz system( parancs) vgrehajt egy UNIX parancsot s annak els sort olvass ugyanaz mint az elbbi, csak egy vltozba olvas lefuttat egy shell parancssort: ennek be s kimenetvel nem kommunikl direkt az awk

Pl. az albbi parancs lefuttatja az ls parancsot s annak els sort olvassa.


$ awk 'BEGIN{"ls" | getline; print $0}' array1.awk

Sajt fggvnyek
A fggvnyek, mint ms nyelvben, szmtsokat csoportostanak, s nv szerinti meghvsukat teszik lehetv. Szintaktikailag van krlttk nhny furcsasg, amire oda kell figyelni. Sajt fggvnyeket az albbi szintaxissal hozhatunk ltre:
function nv (arg1, arg2, . . .) { utastsok; }

A ltrehozs helye az awk szablyokon kvl kell trtnjen a programban (programszervezsi szempontbl mindegy, hogy hol vannak a szablyokon kvl: nem szksges ket hasznlatuk eltt definilni. Ajnlott a program vgre tenni ket. Fontos: az awk szerzi figyelmeztetnek, hogy sajt fggvny hvsakor ne rjunk szkzt a fggvny neve s a zrjel kz, a:
fuggvenynev (

szerkezetben a szkzt a kontextustl fggen a nyelv rtkelheti gy is, mint egy sztring sszefzs opertort, ezrt j megszokni, hogy a nv s zrjel kz ne tegynk szkzt. Az argumentumok loklis vltozk lesznek a fggvny testben. Ezzel ellenttben, ha a fggvny belsejben vltozkat hozunk ltre, azok globlisan viselkednek, teht alkalmasak a fprogrammal 12

Opercis rendszerek I. - UNIX felhasznli ismeretek s hjprogramozs

val kommunikcira. Azrt, hogy ezt (a fggvnyben ltrehozott vltozk lthatsga a fprogrambl) elkerljk, a fggvnyben hasznlt bels vltozkat is felsoroljuk az argumentumlistban, de rtkket nem adjuk meg hvskor, gy res vltozkk inicializldnak. Pl.:
function hatvany(i ,j, hat=i**j return hat } hat) {

Hvskor gy hvjuk meg:


x=hatvany(2,3) s akkor a hat nem lesz lthat a fprogrambl.

Az awk programbl az albbiak szerint hasznljuk a fggvnyeket:


nv(kifejezs1, kifejezs2, )

vagy
vltoz=nv(kifejezs1, kifejezs2, ) amennyiben a fggvny return kifejezs ; utastssal lp ki, s egy rtket rendel hozz.

A fggvnyeket lehet rekurzv mdban hasznlni. Az albbi program szmok ngyzett listzza. Itt, br nem hasznltuk fel, a negy vltoz is ltrejn s lthat lesz a fprogramban mivel nevt nem adtuk meg a fggvny argumentumai kztt.
#!/usr/bin/awk -f BEGIN { for (i=0; i< 10; i++) { printf "%4d\t%4d\n", i,negyzet(i) } print "\na fprogrambl lthat negy:" negy } function negyzet(i) { negy=i*i return negy }

A program futtatsakor ezt ltjuk:


$echo '' | awk -f negy.awk 0 0 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81

13

Opercis rendszerek I. - UNIX felhasznli ismeretek s hjprogramozs a fprogrambl lthat negy:81

Tmbk az awk-ban
Az awk-ban hasznlt tmbk asszociatv tmbk, teht egy kulcshoz egy rtket rendelnek. Mivel az awk ltal hasznlt "alap" adattpus a sztring, ezrt a kulcsok mindig sztringek.
{ a[1]="elso" a["masodik"]="masodik" a[2]=122.3 } END { print a[1]; print a["masodik"] ; print a[2] } elso masodik 122.3

A kulcsoknak: -nem kell szekvencilisan egyms utn jnnik. gy knnyen el lehet lltani gynevezett "szrt" tmbket (sparse array). -tulajdonkppen akkor is sztringek, ha szmokat hasznlunk kulcsknt -az rtkek awk vltozk vagy konstansok A tmbk rtkeinek elrst megtehetjk ha ismerjk a kulcsokat illetve ha egy specilis for ciklust hasznlunk. A kulcsok ismeretben ez egyszer mint a fenti plda print utastsai esetben, vagy:
s=a["masodik"]

Amennyiben nemltez kulccsal hivatkozunk egy tmb elemeire, az awk nem ad hibt, a visszaadott rtk viszont az res sztring lesz. A tmbkre alkalmazhat for ciklus szintaxisa pedig az albbi:
for (kulcs_valtoz in tmb_vltoz) utasts

A fenti tmbt teht gy listzzuk:


{ a[1]="elso" a["masodik"]="masodik" a[2]=122.3 } END { for ( ix in a ) { print a[ix]; } } Kimenet:

14

Opercis rendszerek I. - UNIX felhasznli ismeretek s hjprogramozs masodik elso 122.3

Lthat, hogy a kilistzott elemek nem olyan sorrendben jelennek meg, ahogy deklarltuk ket, hanem ahogyan az awk trolja az elemeket. Annyit tudunk, hogy a for ciklus vgigjr minden elemet, de hogy milyen sorrendben azt nem. Elemeket a tmbbl a delete fggvnnyel lehet trlni:
delete tmb_vltoz[kulcs]

Tudnunk kell, hogy a for ciklus esetben az iterci a kulcsokon lpked vgig, teht az rtkek listzshoz mindig hasznlnunk kell a kulcsokat. Ha valaki mgis egy bizonyos sorrendben akarja vgigjrni a tmbt, akkor sajt magnak kell azt megszerveznie. Ezt gy lehet a legknnyebben elrni, ha numerikus kulcsokat hasznl. Ilyenkor a tmb ltrehozsnl el kell lltani az egyms utni kulcsokat, majd ugyangy hivatkozni rjuk (lsd albb a pldt). Az elemek kapcsn a dntshelyzeteket egy specilis if utastssal lehet megoldani, amelynek szintaxisa az albbi:
if ( kulcs_vltoz in tmb_vltoz) utasts

a[1]="elso" a[3]="masodik" if ( 1 in a ) print "van a[1] elem a if ( "1" in a ) print "van a[2] elem a if ( 3 in a ) print "van a[3] elem a if ( 2 in a ) print "van a[2] elem a else print "nincs a[2] elem tombben" tombben" tombben" tombben" a tombben"

} Kimenet: van a[1] elem a van a[2] elem a van a[3] elem a nincs a[2] elem tombben tombben tombben a tombben

Trjnk vissza az elemek sorban val vgigjrhatsghoz. Az albbi pldban tudjuk, hogy a tmbnek csak numerikus kulcsai vannak, megnzzk elszr, hogy melyik a maximlis s minimlis kulcs, utna ezek kzt iterlunk, s csak azokkal a kulcsokkal dolgozunk, amelyek tnylegesen lteznek a tmbben. 15

Opercis rendszerek I. - UNIX felhasznli ismeretek s hjprogramozs

Figyeljk meg a legutols if szerkezetet, amely tnylegesen csak azokat a tmbelemeket vlasztja ki, amelyek lteznek.
{ #letrehozom az elemet, figyeljuk meg, hogy a tomb hezagos a[3]="elso" a[2]="masodik" a[7]=55 #megprobalom kideriteni a maximalis es minimalis indexet # a +0 szerkezetet azert kell hasznalni az indexnel, #hogy # rakenyszeritsuk az awk-t, h. szamkent kezelje # az indexet min=0; max=0; # ez itt "tomb" for for (x in a) { if ( x+0 < min ) min=x if ( x+0 > max ) max=x } #ezek utan tudjuk a hatarokat, es normal for ciklussal #iteralhatunk for ( i =min; i<=max; i++) { # ez itt klasszikus for if ( i in a ) { print "a tomb kulcsa=" i " az erteke pedig=" a[i] } } } Kimenet: a tomb kulcsa=2 az erteke pedig=masodik a tomb kulcsa=3 az erteke pedig=elso a tomb kulcsa=7 az erteke pedig=55

Tmbk ltrehozsa a split fggvnnyel


A split fggvnyt egy sztring feldarabolsra hasznljuk. Az eredmnyt egy tmbben kapjuk meg.
szm = split ( sztring , tmb_vltoz, regex ) A kvetkezt vgzi: a regex regulris kifejezst hasznlva mez hatrnak, feldarabolja a sztringet, s a darabokat tmbrtkknt hozzrendeli tmb_vltoz tmbhz. A tmb kulcsai egsz szmok lesznek, 1-tl kezdden. A szm visszatrtett rtk az elemek ltrejtt elemek szmt adja. $ echo 'abc xyz pqgr'| awk '{ n=split($0, a, / /); \ > print "a kapott elemek szama:" n ", az elso elem:" a[1]}' a kapott elemek szama:3, az elso elem:abc

vagy, ha a szavak vgn punktucis karakterek vannak:

16

Opercis rendszerek I. - UNIX felhasznli ismeretek s hjprogramozs $ echo 'abc, xyz. pqgr!'|awk '{ n=split($0, a, /[[:punct:]] /); \ print "a kapott elemek szama:" n ", az elemek: " a[1] " " a[2] " " a[3]}' a kapott elemek szama:3, az elemek: abc xyz pqgr!

Tbbdimenzis tmbk
A tbbdimenzis tmbk krdst a nyelv gy oldja meg, hogy a tmbk kulcsnak megadsnl vesszt hasznlhatunk elvlasztknt a kulcsknt megadott sztringben: gy az elvlasztott alsztringeket kln kulcsoknak tekinthetjk.
{a[6,7]=3; a[6,8]=4; print a[6,7]+a[6,8] }

Bibliogrfia
1. Bki Andrs: UNIX/Linux hjprogramozs, Kiskapu, 2002, Az awk c. fejezet 2. A GNU Awk felhasznli kziknyve, http://www.ms.sapientia.ro/~lszabo/oprendszer1/gawk/ letlteni az albbi cmrl lehet: http://hexahedron.hu/personal/peteri/gawk/index.html 3. Awk, HUP Wiki, http://wiki.hup.hu/index.php/Awk

17

You might also like