A uniq utasítás

A uniq parancs kiszűri az egy állományban található egymás után ismétlődő sorokat, és csak egyszer írja ki az ismétlődő sort (célszerű lehet ezért az állományt először a sort utasítással rendezni). A parancsot olyankor használjuk, amikor például egy listában ki akarjuk szűrni az ismétléseket. A parancsnak a kapcsolókon kívül két argumentuma lehet, a bemeneti és a kimeneti állomány. Ezek hiányában a standard kimenetre illetve bemenetről dolgozik.

A parancs alapértelmezésben teljes sorokat hasonlít össze. Lehetőség van arra is, hogy az összehasonlítás során ne vegyen figyelembe megadott mezőket (a mező egy olyan karaktersorozat, melyet egy vagy több elválasztókarakter --- általában szóköz vagy tabulátor --- választ el egy másik karaktersorozattól).

Az uniq parancs kapcsolói a következők:

-c A kimeneten megjelenő sorok elé beírja, hogy az adott sor hányszor fordult elő a bemenő állományban.

-d Csak az ismétlődő sorokat írja ki.

-u Csak az egyszer előforduló sorokat írja ki.

-f Szám Az összehasonlítás során a Szám-nak megfelelő számú mezőt figyelmen kívül hagy. A kapcsolót -Szám alakban is használhatjuk.

-s Szám Az összehasonlítás során a Szám-nak megfelelő számú karaktert hagy figyelmen kívül. Ha a -f kapcsolóval együtt használjuk, akkor a megadott számú mezőt hagyja először figyelmen kívül, majd az első, az összehasonlításnál használandó mezőből hagy figyelmen kívül Szám darab karaktert. A kapcsolót +Szám alakban is

használhatjuk.

Vegyük például a tagok nevű állományt, amely a következő

neveket tartalmazza:

joska

pista

joska

lajos

pista

joska

A

uniq tagok > osszes

parancs létrehozza az osszes nevű állományban a

joska

pista

lajos

sorokat.

Állományok sorrendbe rendezése: a sort utasítás

Az állományok bizonyos szempont szerinti sorrendbe tételére, illetve a már rendezett állományok helyes sorrendben való összefűzésére szolgál a sort parancs.

A parancs az argumentumában megadott állománynevet (ennek hiányában a standard inputot) rendezi, és az eredményt a standard kimenetre írja (kivéve ha a -o kapcsolóval megadjuk a kimeneti állomány nevét). Több bemeneti állománynevet is megadhatunk, ilyenkor a sort parancs összefűzi őket, és az így kapott állományra végzi el a rendezést. Az alapértelmezésbeli rendezés az (angol) ABC sorrend szerint történik.

A rendezés mezők és oszlopok kijelölésével történhet. A mező az elválasztókarakterek (ez általában a szóköz és a tabulátor) közötti karaktersorozat. Az elválasztókaraktert a -t kapcsolóval adhatjuk meg. Az oszlop a mezőn belüli karakterpozicíó. A mező és/vagy az oszlop számát rendezési kulcsnak hívjuk.

A sort parancs a rendezést a megadott kulcsok sorrendjében végzi, azaz először az első kulcs szerint rendez, és a kulcson belül megegyező sorokat a második megadott kulcs alapján rendezi tovább (stb.).

A sort parancs kapcsolói közül ha a -b, -d, -f, -i, -n és a -r kapcsolók egy rendezési kulcs előtt állnak, akkor módosítják annak hatását. Ezek a kapcsolók nem állhatnak magukban a -k kapcsoló után. Ha ezek a kapcsolók a (-k-nál szereplő) ún. KulcsDefinícióhoz vannak rendelve, úgy csak az adott rendezési kulcsra vonatkoznak. Amennyiben ezen kapcsolók egyike a +MSzám.OSzám vagy -MSzám.OSzám kulcsok valamelyike után fordul elő, csak arra a kulcsra fejti ki hatását.

-A

Az ASCII szekvencia szerint végzi el a rendezést (az alapértelemzést a helyi nyelvre is át lehet állítani).

-b

Figyelmen kívül hagyja a sor elején álló szóközöket vagy tabulátorokat az oszlopok kiszámolásánál.

-c

Lellenőrzi, hogy a megadott állomány a megadott szabályok szerint sorba van-e rendezve. Ha igen, nulla értékkel tér vissza.

-d

ABC sorrend szerint végzi a rendezést. Csak a betűk, számok és a szóközök számítanak.

-f

Rendezés előtt az összes kisbetűt nagyra cseréli.

-i

Figyelmen kívül hagyja az összes nem nyomtatható karaktert az összehasonlítás során.

-kKulcsDefiníció

Egy keresési kulcsot definiál:

[KezdőMező][.KezdőOszlop][Módosító][,[VégMező][.VégOszlop][Módosító]]

A szögletes zárójelek azt jelzik, hogy nem kötelező megadni a bennük levő számokat. A rendezés a KezdőMező KezdőOszlopa és a VégMező Végoszlopa közötti karakterek szerint történik.

A Módosító a b,d,f,i,n és r értékek valamelyike lehet. Hatásuk megfelel az azonos betűvel jelölt kapcsolókénak. A fenti mennyiségek alapértékei: a KezdőMező a sor eleje, a KezdőOszlop az első oszlop a mezőben, a VégMező az utolsó mező, és a VégOszlop a mező utolsó oszlopa. A

-k 3.2,3r

kapcsoló olyan rendezést jelent, melyben a 3. mező 2. pozíciójától a 3. mező végéig (nincs kitéve a VégOszlop}) folyik a rendezés, fordított sorrendben (l. -r kapcsoló). A fenti definíció megadható a -k kapcsoló használata nélkül is, ha pl. a KezdőMező elé plusz, a VégMező elé mínusz jelet írunk. Ilyenkor a + kapcsoló jelzi az átugrandó mezők számát, míg a - kapcsolóval adjuk meg azt a legutolsó mezőt, amelyik még számít. Az előző példa ezzel a módszerrel ezért ilyen:

+2.1 -3r

-m

Több, már rendezett állományt fűz össze egy rendezett állományba.

-n

A számokat tartalmazó mezőket a számértékük szerint rendezi. Mivel az ASCII sorrend szerint pl. a 10 előbb van, mint a 2 (a 2-es számjegyet megelőzi az 1), a numerikus kifejezéseket csak így lehet sorbarendezni. A numerikus mező tetszőleges számú szóközzel és tabulátorral kezdődhet, tartalmazhat előjelet, tizedes értékeket, az ezreseket elválasztó jelet. Minden más jel a felhasználó számára is érdekes eredményt szolgáltat.

-o Állomány

A rendezés eredményét a megadott Állományba irányítja. Megadhatjuk itt ugyanazt az Állománynevet is, amelyiket éppen rendezünk.

-r

Megfordítja a rendezés sorrendjét.

-tKarakter

A megadott Karaktert tekinti a sort a mezőket elválasztó karakternek.

-u

Ha a rendezés során több sort egyenértékűnek talál a sort}, akkor a -u kapcsoló hatására csak egyet ír ki.

-T Könyvtár

Az összes, a rendezés során használatos átmeneti állományt a megadott Könyvtárba helyezi. Akkor célszerű használni, ha nagy állományt rendezünk, és a mi könyvtárunkban (file rendszer) kevés a hely.

Például rendezzük a következő minta.txt állományt különböző

szempontok szerint:

+Kalmanka 16

lajoska 4

Peterke 28

Jozsika 12

lajoska 34

peterke 28

Sanyika 111

A legegyszerűbb sorbatétel a következő:

sort minta.txt

+Kalmanka 16

Jozsika 12

Peterke 28

Sanyika 111

lajoska 34

lajoska 4

peterke 28

A rendezés először a jeleket, aztán a nagybetűket, utána a kisbetűket veszi ABC sorrendben. Ha lexikográfiai rendezést hajtunk végre a -d kapcsolóval, akkor az figyelmen kívül hagyja a jeleket, így +Kalmanka} a Jozsika és Sanyika közé kerül. ASCII rendezés (-A kapcsoló) esetén a jelek a kis és nagybetűk közé kerülnek, és Kalmanka Sanyika és lajoska közé kerül.

A következő parancs lexikografikus sorrendbe teszi az állományt úgy, hogy nem tesz különbséget kis- és nagybetű között (l. -f kapcsoló), és az ismétlődő sorokat csak egyszer írja ki (l. -u kapcsoló):

sort -d -f -u minta.txt

Jozsika 12

+Kalmanka 16

lajoska 34

lajoska 4

peterke 28

Sanyika 111

Most nem teszünk különbséget kis- és nagybetű között, ezért hiányzik a Peterke 28 sor is.

Rendezzük most az állományt a második mező (számok) szerint. A következő parancs ABC sorrend szerint rendez, azaz minden 1-gyel kezdődő megelőzi a 2-vel kezdődőket:

sort +1 minta.txt

Sanyika 111

Jozsika 12

+Kalmanka 16

Peterke 28

peterke 28

lajoska 34

lajoska 4

A következő parancs a számsorrend szerinti rendezéshez szolgál:

sort +1 -n minta.txt

lajoska 4

Jozsika 12

+Kalmanka 16

peterke 28

Peterke 28

lajoska 34

Sanyika 111

Amikor a mezőket egymástól nem szóközök, hanem például kettőspontok választják el, mint pl. a /etc/passwd állományban, akkor meg kell adni az elválasztókaraktert. A rendszer összes felhasználójáról a

sort -t: +4 /etc/passwd

paranccsal kapunk a nevek szerinti ABC sorrendben listát (ha a rendszergazda nem volt lusta, és beírta a neveket).

Az awk programnyelv

A UNIX általános célú állomány feldolgozó programja az awk. Működésének alapja, hogy megadott mintájú sorokat keres, és azokon az általunk megadott utasításokat hajta végre. A program neve Aho, Kernighan és Weinberger nevének összevonásából ered.

Az awk nyelv a legelső változat kialakulása óta bővült: némely UNIX rendszerben az újabb verziót nawk-nak (new awk) nevezik. Mi csak a program GPL változatával foglalkozunk (gawk), ezért --- amennyiben az adott rendszerben létezik a gawk parancs --- a példákban mindenhol azt kell használni az awk utasítás helyett.

A parancs első argumentuma az awknak szóló utasításokat tartalmazza, majd ezután következik az az állomány, amit az awk feldolgoz. Ha nem adunk meg állományt, akkor a standard bemenetről vár adatot. Több állomány esetén az awk úgy dolgozza fel őket, mintha a megadott sorrendben egymás után fűztük volna őket. Mivel általában hosszasabb utasítássorozatot adunk meg, ezért lehetőség van az utasításokat tartalmazó állományt megadni az awknak az

awk -f Parancsállomány

alakban. A feldolgozott adatokat az awk alapértelmezésben a standard kimenetre írja.

A feldolgozás során az utasításokban megadott kiterjesztett reguláris kifejezések szerint elemzi az adatállomány aktuális sorát, és egyezés esetén végrehajtja a mintához tartozó parancsot. Az awk a parancsállomány összes sorát végignézi további egyezéseket keresve, és csak utána tér rá az adatállomány következő sorára.

Az awk megengedi változók, számokkal vagy karakterekkel operáló függvények és logikai kifejezések használatát.

Az awk interpreter szinten működik, azaz a parancsállományt nem kell lefordítani (mint általában a programozási nyelvek forráskódját), emiatt azonban lassabban futnak le az utasítások.

Az awk kapcsolói a következők:

-f Állomány

Az awk parancs az Állomány parancsállományból veszi az utasításokat. A kapcsoló ismételhető, és ilyenkor a megjelenés sorrendjében összefűzött állományt használja parancsállománynak az awk.

-F KRK

A KRK-t használja mező elválasztó karakternek.

-v Hozzárendelés

Értéket ad egy változónak. A Hozzárendelés Név=Érték alakú. A hozzárendelést az awk még a BEGIN rész lefuttatása előtt elvégzi.

Az adatállomány feldolgozása

Az awk programnyelvben a BEGIN speciális parancs definiálja azokat az utasításokat, melyeket az adatállomány feldolgozása előtt kell végrehajtani (például számlálók nullázása, stb.) Ennek végrehajtása után az awk beolvas egy rekordot az állományból. A rekord az ún. rekord elválasztójellel szeparált adattömeg. Ez az elválasztójel alapesetben az újsor karakter, de az RS változó értékének változtatásával átállítható (pl. a BEGIN utasításnál).

A következő lépésben az awk a beolvasott rekordot összehasonlítja a parancsállományban lévő mintákkal azok megjelenési sorrendjében, és egyezés esetén végrehajta a hozzájuk tartozó parancsokat. A parancsban a rekordokban lévő mezőkkel is operálhatunk (alapesetben a szóközzel vagy tabulátorral elválasztott karaktersorozatok). A mező elválasztókaraktert vagy az awk -F kapcsolójával, vagy az FS változó értékével lehet beállítani.

A mezők értékeire a $1, $2 ... kifejezésekkel hivatkozhatunk, melyek rendre az első, második, stb. mezőt jelentik. A $0 az egész rekordot jelenti.

Miután az awk a rekordot az összes mintával összehasonlította és végrehajtotta az előírt parancsokat, beolvassa az adatállomány következő rekordját. Ez egészen addig folytatódik, amíg van bemenet. Az utolsó állomány utolsó sorának feldolgozása után az awk végrehajta az END speciális parancsban megadott utasításokat.

Az awk programnyelv

Az awk parancs általános szerkezete a következő :

Minta {Utasítás}

Ha a Minta megegyezik a rekorddal, akkor az Utasítás végrehajtódik. Ha nem adunk meg Utasítás-t, akkor a teljes rekord változtatás nélkül a standard kimenetre kerül. A Minta nélküli Utasítás minden rekordra végrehajtódik.

A Minta vagy egy kiterjesztett reguláris kifejezést, vagy egy összehasonlítást tartalmaz, de lehet ezek kombinációja, esetleg a BEGIN vagy END speciális szavak egyike is.

A kiterjesztett reguláris kifejezés

A kiterjesztett reguláris kifejezés a reguláris kifejezésekre (RK) épül. A keresett mintát törtjelek közé tesszük. A kiterjesztett RK a következő speciális karaktereket használja:

+

Az előtte levő karakter egy vagy több előfordulását helyettesíti. Hasonlít a *-hoz, mely nulla, vagy több előfordulást helyettesít.

?

Az előtte álló karakter nulla vagy egy előfordulását helyettesíti.

.

A pont az újsor karakter kivételével mindent karakterrel egyezik. A /a..at/ helyettesíti az allat kifejezést.

*

Az előtte álló karakter nulla vagy több előfordulását helyettesíti.

~, ~!

Az előtte megadott változóra vizsgálja meg, hogy az utána megadott RK-val egyezik-e. A

$1 ~ /n/ kifejezés

minden olyan sorral egyezik, melyben az első mez\ő tartalmazza az n betűt.

\car

A mező vagy a rekord elejére hivatkozik. A

$2 ~ /^.h/

kifejezés a második mező elején álló h betű esetén ad egyezést.

$

A mező vagy a rekord végére hivatkozik.

||

A szűrő jel két oldalán levő kifejezés bármelyikének egyezése esetén egyezést ír elő. Például a

/kutya/||/macska/

minden olyan sort kiválaszt, melyben vagy a kutya vagy a macska} szó előfordul.

( )

Csoportosítja egy RK-n belül a karaktersorozatokat.

A + vagy a ? kapcsolóval együtt szokás használni. Például

/(zi)?(zi)?/

kifejezés az üres sorral (nulla előfordulása mindkét kifejezésnek), a zi és a zizi szavakkal egyezik meg.

{m}

Az előtte levő karakter pontosan m darab egymás utáni előfordulását helyettesíti. A

l{2}

kifejezés például az allat szó esetén igaz.

{m, n}

Az előtte levő karakternek m és n közötti számszor kell egymás után előfordulnia (m

[Karaktersorozat]

A Karaktersorozat}ban előforduló bármelyik karakternek kell a vizsgált rekordban előfordulnia. Egész tartományok is megadhatók, például a

/ll[a-e]/

az allat és az ellet} szavakkal is egyezik (a kifejezést a

/ll[abcde]/

alakban is megadhattuk volna). A kapcsos zárójelen belüli első helyen a ^ karakter azt jelenti, hogy az utána megadott karaktereknek nem szabad előfordulniuk. A

ll[^b-e]

kifejezés az allattal egyezik, de az ellettel már nem.

Ha a speciális karakterek valamelyikét szeretnénk expliciten megjelentetni a kifejezésekben, azokat a fordított törtjellel kell levédeni. Például törtjelet a szövegben a következő kifejezéssel lehet keresni:

/szoveggblabla/

A minta az összes szoveg/blabla kifejezést tartalmazó rekorddal megyezik.

Az awk ismeri a C nyelvben használatos speciális szekvenciákat is, így a \ddd kifejezés megadásával tetszőleges karakter ASCII kódját is megadhatjuk a ddd oktális formában. A fordított törtjellel levédett speciális kifejezések közül az awk} ismeri a macskaköröm, törtjel, a fordított törtjel (önmaga levédése), a b (karakter vissza), a \n (újsor), a \r (kocsi-vissza), \t (tabulátor) és az \a (csengő), \f (lapdobás) és a \v (vertikális tabulátor) vezérlő karaktereket.

Az összehasonlítások

Az összehasonlítás során két kifejezést mérünk össze

a <, >, <=, >=, == és != jelekkel (sorrendben: kisebb, nagyobb, kisebb egyenlő, nagyobb egyenlő, egyenlő, nem egyenlő). A

$1 < $4

minden olyan rekorddal egyezik, melyben a negyedik mező nagyobb az elsőnél (vagy mint szám, vagy karakterek esetén az ABC sorrend alapján). Hasonló módon megadhatjuk, hogy az első mező ne legyen q betű:

$1 != "q"

A minták kombinációja

Ha két mintát vesszővel választunk el, akkor az awk több rekordot is kiválaszt a megfelelő utasításra: kiválasztja az adott tartományban azt a sort, amelyik az első mintával egyezik, majd utána keresi azt a sort, amelyik a második mintával egyezik, és rájuk, valamint minden közöttük lévő rekordra is végrehajtja a parancsot.

Alkalmazhatunk logikai műveleteket a minták között a következő

kifejezésekkel: a || (és), && (vagy), ! (nem). A

$1 == "igen" && $2 == "42"

minden olyan sort kiválaszt, melyben az első mező az igen, a második pedig {42}.

A mintákat zárójelekkel is csoportosíthatjuk.

A BEGIN és END kifejezések

A BEGIN-nel felsorolt parancsok az első rekord beolvasása BEGIN előtt, az END-del felsoroltak az utolsó rekord feldolgozása után hajtódnak végre. Ha a parancsállomány csak egy BEGIN-ből áll, akkor az hajtódik végre, és nem olvassa be a rekordokat. Ha csak egy END-ből, akkor beolvassa az összes rekordot, mielőtt végrehajtaná az END parancsokat.

Változók

Az awkban használhatunk skalár, mező, tömb és speciális változókat. A változók neve nem kezdődhet számjeggyel. A használt változókat nem kell előre definiálni. Ha nem adunk kezdőértéket egy változónak, akkor numerikus változó esetén 0 lesz az értéke (akár skalár, akár tömb), karakterlánc esetén pedig a nulla karakterlánc. A változók a szövegkörnyezet alapján automatikusan numerikus, vagy string értéket kapnak. A stringek esetén az értéket macskakörmök közé kell tenni. Például az

x = "4" + "8"

kifejezésben két stringet adunk össze, de mivel az awk ezt számként tudja értelmezni, és így az x változóhoz 12-t rendel. Ha egyszerűen azt akarjuk, hogy egymás után kerüljön a 4 és a 8 számjegy (48-at mutatva), akkor nem kell a plusz jel. Amennyiben a változó stringet tartalmaz, akkor numerikus kifejezésekben értéke 0 lesz.

Tömbökre a változó után írt szögletes zárójelekkel hivatkozhatunk, ahol a zárójelek között a tömb indexe áll. A tömbök méretét az awk automatikusan változtatja. A tömb indexe lehet szám is, de string is! (Ez utóbbi esetben persze kicsit nehézkes végigmenni a tömb elemein, de erre való az awk saját

for (Index in Tömb)

ciklusa.)

Például a bolha, elefánt és csiga szavak előfordulását a bemenő állományban a következő parancsokkal számolhatjuk meg (mivel stringeket keresünk, ezért pl. a csigabiga kifejezés is a csiga} csoportjába tartozik):

/bolha/ { x["bolha"]++ }

/elefant/ { x["elefant"]++ }

/csiga/ { x["csiga"]++}

END {print "bolha ", x["bolha"];

print "elefant ", x["elefant"];

print "csiga ", x["csiga"];}

Egy tömbnek több indexe is lehet, ezeket a szögletes zárójelen belül vesszővel kell elválasztani.

A speciális változók az awk működését befolyásolják. Itt csak a legfontosabbakat soroljuk fel, bővebbet a man awk paranccsal tudhatunk meg.

FILENAME

Az aktuális feldolgozás alatt álló állomány teljes neve.

FNR

Az éppen feldolgozás alatt lévő rekordnak az aktuális állománybeli sorszáma.

FS

A beolvasott rekordokra vonatkozó mező elválasztókarakter, alapesetben a szóköz (ilyenkor a mezőket tetszőleges számú szóköz választhatja el). Az FS értéke lehet KRK (kiterjesztett reguláris kifejezés) is.

NF

Az aktuális rekordban levő mezők száma, ami legfeljebb 99 lehet.

NR

Az éppen feldolgozás alatt álló rekord sorszáma. Egy adatállomány esetén megegyezik az FNR változóval, de ez utóbbi minden új állomány esetén nullázódik.

OFS

A kiírás során a mezőket elválasztó karakter. Alapértéke a szóköz. Például a

awk '{OFS=":"; print $1,$2}' gyakorlas

a gyakorlas állomány minden sorának első két szavát :-al elválasztva írja ki.

ORS

A kiírás során a rekordokat elválasztó karakter. Alapértéke az újsor. Például a

awk '{ORS="+"; print $0}' gyakorlas

a gyakorlas állomány sorait egyben, csak egy + jellel elválasztva írja ki.

RS

A bemeneti rekordokat elválasztó karakter. Alapértéke az újsor. Ha nullára állítjuk értékét, akkor a rekordokat egy vagy több üres sor választja el egymástól, és az újsor mindig mező elválasztó karakter lesz, függetlenül az FS értékétől.

Az awk utasításai

Az awknak rengeteg utasítása van. Itt csak a legfontosabbakat soroljuk fel. Az utasítások kapcsos zárójelek között állnak. Több utasítást is fel lehet sorolni, egymástól pontosvesszővel elválasztva. Megjegyezzük, hogy a felhasználó maga is írhat saját függvényeket.

A következő matematikai operátorokat használhatjuk a kifejezésekben: +, -, /, ^ , *, % (összeadás, kivonás, osztás, hatványozás, szorzás, és modulo). Például a

$2=$1 ^ $3

a második mezőhöz az első mező harmadik mezőbeli hatványát rendeli.

A ++ és -- a C nyelvbeli inkrementálást és dekrementálást jelöli (állhat mind a változó előtt, mind utána). Ugyanígy működnek a C-ben megszokott rövidítések is: +=, -=, /=, *=.

Karakterláncokat a legegyszerűbben úgy fűzünk össze, hogy egymás után írjuk őket. Például:

$3 = $1 $2.

Az awk függvényei

A beépített függvények között található a cos(x), sin(x), atan2(y,x), exp(x), log(x), sqrt(x), int(x), rand(x) (cosinus, sinus, arcus tangens y/x -- radiánban --, e alapú hatványozás, természetes alapú logaritmus, négyzetgyök, egészrész, és egy 0 és 1 közötti véletlenszám). A karakterláncokkal a következő függvények operálnak:

sub(KRK,Hely,[Változó])

A KRK-ban definiált, a Változó}ban előforduló első egyező karakterláncot a Helyben definiált módon lecseréli. Ha nem adunk meg Változót, akkor az egész rekordot veszi. A függvény visszatérési értéke a helyettesítések száma. Az & jel a Hely kifejezésben a Változó azon karakterláncát veszi fel, amelyikre a KRK minta illett.

gsub(KRK,Hely,[Változó])

Ugyanaz, mint a sub függvény, de a Kiterjesztett Reguláris Kifejezés (KRK) minden előfordulását cseréli.

index( String1,String2 )

Megmondja azt a pozíciót (1-el kezdve), ahol a String2 kifejezés a String1-ben kezdődik.

Ha a String2 nem fordul elő a String1-ben, nullát ad.

length(String)

A String1 karakterlánc hosszát adja meg.

substr( String,M,[N])

A Stringben megadott karakterláncból kivág az M. poziciótól N darab karaktert (ha N nincs megadva, akkor a String végéig).

tolower(String)

Kisbetűkké konvertálja a String értékét, és azzal tér vissza.

toupper(String)

Nagybetűkké konvertálja a String értékét.

sprintf(Formátum, Kifejezés1, Kifejezés2, ... )

A C nyelv szabályai szerint a megadott Formátum}ban kiírja a felsorolt Kifejezéseket, és az így létrejött karakterlánccal tér vissza.

Az aritmetikai és karakterfüggvényeken kívül van még néhány általános függvény is. Az egyik leghasznosabb a system(Parancs), mely egy shell Parancsot hajt végre, és annak visszatérési értékével tér vissza.

Feltételek

A legtöbb awk feltételes kifejezés szintén a C nyelv alapján épül fel. A feltételeket a ( ) zárójelek segítségével csoportosíthatjuk. A feltétel és az annak teljesülése esetén végrehajtandó parancs külön sorban is lehet, de egy sorba is írható. Ha egy feltétel esetén több utasítást is kiadunk, azokat

kapcsos zárójelek közé, pontosvesszővel elválasztva egy sorban vagy külön sorban kell beírni.

A C nyelv feltételes utasításai közül az awk a következőket ismeri:

if (Kifejezés}) { Utasítás } [ else {Utasítás} ]

Feltételes utasításvégrehajtás a Kifejezés értékétől függően.

while (Kifejezés}) {Utasítás}

Ciklus végrehajtása a Kifejezés értékétől függően.

for (Kifejezés1; Kifejezés2; Kifejezés3) { Utasítás}

Ciklus végrehajtása a Kifejezésekben megadott értékétartományra.

break

A while vagy for cikluson belül a ciklusból való kilépést jelenti.

continue

A while vagy for cikluson belül a ciklus következő tagjára való ugrást jelenti.

A C nyelvtől eltérő feltételek a következők:

for(Változó in Tömb ) { Utasítás }

A Változó értékét a Tömb egymás után minden indexnek felelteti meg, és végrehajtja az Utasítást. A sorrend nem rendezett.

delete Tömb[Kifejezés]

Kitörli a Tömb} Kifejezéssel megadott indexű elemét. Ha g egy tömb, akkor a

for (i in g)

delete g[i];

kitörli a g tömb összes elemét.

next

Befejezi az aktuális rekord feldolgozását, és a következő rekord feldolgozását kezdi el az utasítássorozat elejéről.

exit [Kifejezés]

Végrehajtja az össze END által definiált parancsot, majd befejezi az awk futását, és a Kifejezésben megadott értékkel tér vissza. Az END parancssorozaton belül kiadva nem hajtja végre a további END parancsokat, hanem kilép a programból.

#

Megjegyzést írhatunk mögé. Bárhol kezdődhet a sorban, és az újsor karakterig tart.

Kiíratás

Az awkban két parancs szolgál kiíratásra, a print és a printf.

A print a mögötte felsorolt kifejezések értékeit írja ki a standard kimenetre. A kiírás során a szóközzel vagy tabulátorran elválasztott kifejezéseket közvetlenül egymás után írja. A vesszővel elválasztott kifejezéseket az OFS speciális változó értéke választja el egymástól (ez alapesetben a szóköz), a sor végén pedig az ORS változó értékét (alapesetben újsor) írja ki a print.

A kimenetet átirányíthatjuk a parancs végére írt >, >>, | szokásos átirányító jelekkel, és utána megadjuk az állomány nevét (ha magát az állománynevet adjuk meg, tegyük idézőjelbe, hogy a print karakterláncnak, és ne változónak gondolja), vagy a szűrő esetén a parancs nevét.

A printf parancs nagyon hasonlít a printre, de a kifejezések előtt egy, a kiírás formátumát előíró kifejezést vár. Ennek formátuma a C nyelvbeli szabályokkal adható meg. A formátum után állhatnak a kiirandó kifejezések és esetleges átirányítások.

Példák

A prog.f állomány hetedik sorát a következő módon írathatjuk ki:

awk 'NR == 7 { print }' prog.f

A gyakorlas állományból az összes Eb mintát a második mezőben tartalmazó sort a következő paranccsal írathatjuk ki a sorszámmal együtt:

awk '$2 ~ /Eb/ { print NR, $0 }' gyakorlas

A 72 karakternél hosszabb sorokat (FORTRAN programozók, figyelem!) a következő módon szűrhetjük ki a prog.f állományból:

awk 'length($0) $>$72' prog.f

Az utasítás minden 72 karakternél hosszabb sort kiválaszt, és --- mivel nincs utasítás mellékelve --- kiírja a standard kimenetre.

A következő példa minden sort kiír a minta.txt állományból a start és stop szavakat tartalmazó sorok között:

awk '/start/,/stop/' minta.txt

Tegyük fel, hogy {berszam.fejtés adatállományban a második oszlop a bruttó, az ötödik pedig a nettó bért tartalmazza. A következő paranccsal összegezhetünk a második és az ötödik oszlopban:

awk -f ossz.awk berszam.fejtes

Itt az ossz.awk parancsállomány például a következőket tartalmazhatja:

{

sum2 += $2

sum5 += $5

}

END {

print "Brutto ber: ", sum2, "Netto ber: ", sum5;

printf "Brutto atlag %f, netto atlag %f\n:", sum2/NR, sum5/NR;

}

A programállományban két változót használunk, és mivel nem adtunk nekik kezdőértéket, ezért azok nulláról indulnak. Nincs megadva sorkiválasztás, így a program minden sorra a sum2 változóhoz a második, a sum5 változóhoz az ötödik oszlop értékét adja hozzá. A legvégén (l. END parancs) az awk kiírja a második és ötödik oszlop összegeit, valamint az átlagértékeket is (az NR változó a beolvasott rekordok (sorok) számát tartalmazza).

A következő awk program az egymástól tetszőleges (de legalább egy) számú vesszővel, szóközzel vagy tabulátorral elválasztott mezők esetén fordított sorrendben kiírja az első két mezőt, majd az eredeti első mezőben összegez. Legvégül kiírja az összeget és az átlagot:

BEGIN {FS = "[, \t]"}

{print $2, $1}

{s += $1}

END {print "az osszeg ",s,", atlaga ", s/NR }

Ha a következő sort betesszük a $HOME/.profile állományunkba, akkor az itt létrehozott REMOTE változó értéke megadja annak a gépnek a nevét, ahonnan bejelentkeztünk:

export REMOTE=`who am i | awk '{gsub("[()]","",$6); print $6}' `