Provided by:
manpages-hu_20010119-5_all 
NÉV
gawk - mintakereső és -feldolgozó nyelv
ÁTTEKINTÉS
gawk [ POSIX vagy GNU stílusú opciók ] -f program-file [ -- ] file ...
gawk [ POSIX vagy GNU stílusú opciók ] [ -- ] file ...
LEÍRÁS
A gawk az AWK programnyelv GNU Project általi megvalósítása.
Alkalmazkodik a nyelv POSIX 1003.2 Command Language And Utilities
Standard-beli definíciójához. Másfelől ez a verzió az - Aho, Kernighan
és Weinberger által írt - The AWK Programming Language leírásán alapul;
a UNIX awk System V Release 4 verziójában található további
szolgáltatásokkal kiegészítve. A gawk újabb keletű Bell Labs
bővítésekkel és néhány GNU-specifikus bővítéssel is szolgál.
A parancssor magának a gawk -nak adandó paraméterekből, az AWK program
szövegéből (ha nem a -f vagy --file opciók segítségével adjuk meg),
valamint - később az ARGC és ARGV előre definiált AWK változókkal
elérhető - értékekből áll.
OPCIÓFORMÁTUM
A gawk opciók lehetnek a POSIX-féle hagyományos egybetűs opciók, vagy a
GNU stílusú hosszú opciók. A POSIX stílusú opciók szimpla kötőjellel
(``-''), míg a GNU hosszú opciói dupla kötőjellel (``--'') kezdődnek.
Egyaránt GNU stílusú hosszú opciókkal vannak ellátva a GNU- specifikus
és a POSIX-ban előírt szolgáltatások. Az AWK nyelv egyéb megvalósításai
valószínűleg csak a hagyományos egybetűs opciókat fogadják el.
Követve a POSIX szabványt a gawk specifikus opciókat a -W paraméterrel
lehet megadni. Megadhatunk több -W paramétert, vagy egyet több
argumentummal. Utóbbi esetben az argumentumokat vesszővel kell
elválasztani; vagy whitespace-szel, és zárójelek közé tenni. A
kis-/nagybetűk egyenértékűek a -W opció argumentumaiban. Mindegyik -W
opciónak megvan a maga GNU stílusú párja (ld. lejjebb). A GNU stílusú
opciók argumentumait vagy az opcióval = jellel összekötve (közbülső
space-ek nélkül), vagy mint a következő parancssori paramétert kell
megadni. A hosszú opciók rövidíthetők mindaddig, amíg a rövidítés
egyedi marad.
OPCIÓK
A gawk a következő opciókat fogadja el:
-FS fs
--field-separator fs
Bemeneti mezőelválasztóként fs értékét használja (alapértelmezés
az előre definiált FS változó értéke).
-v var=val
--assign var=val
A var változóhoz rendeli a val értéket mielőtt a program
végrehajtása megkezdődik. Az ilyen változóértékek elérhetők az
AWK program BEGIN blokkjában.
-f program-file
--file program-file
Az AWK programot a program-file forrásfile-ból, olvassa első
parancssori argumentum helyett. Több -f (or --file) opció
használható.
-mf NNN
-mr NNN
Különféle memóriakorlátokat állít be NNN értékre. Az f jelző a
mezők maximális számát, az r jelző a rekordok maximális számát
állítja be. Ez a két jelző és a -m opció az AT&T Bell Labs
research UNIX awk verziójából származik. A gawk figyelmen kívül
hagyja, mivel a gawk -nak nincsenek elődefiniált korlátai.
-W traditional
-W compat
--traditional
--compat
Futás kompatbilis módban. Amikor kompatíbilis módban fut, a
gawk UNIX awk -kal megegyezően viselkedik, azaz nem ismeri fel e
GNU-specifikus bővítéseket. A --traditional formát részesítjük
előnyban a többivel szemben. További információ: lásd lejjebb a
GNU BŐVÍTÉSEK részt.
-W copyleft
-W copyright
--copyleft
--copyright
Kinyomtatja a szabványos kimenetre a GNU szerzői jogi információ
rövid verzióját, és sikeresen befejezi a futást.
-W help
-W usage
--help
--usage
A rendelkezésre álló opciók egy viszonylag rövid összegzését
nyomtatja a szabványos kimenetre. (A GNU Kdolsi Szablyok -nak
megfelelően ezek az opciók azonnali, sikeres kilépést
eredményeznek.)
-W lint
--lint Figyelmeztet a bizonytalan vagy a más AWK megvalósításra át nem
vihető szerkezetekre.
-W posix
--posix
Bekapcsolja a kompatíbilis módot az alábbi megkötésekkel:
o a \x escape szekvenciákat nem ismeri fel.
o csak a space és a tab működik mezőelválasztóként, amikor FS
értéke space-re van beállítva, az újsor nem.
o A function kulcsszó func szinonímáját nem ismeri fel.
o A ** és a **= operátor nem használható a ^ és a ^= helyén.
o Az fflush() függvény nem elérhető.
-W re-interval
--re-interval
Engedélyezi az intervallum kifejezsek használatát a reguláris
kifejezések illesztésénél (lásd alább: RegulárisKifejezések ).
Intervallum kifejezések eredetileg nem voltak használhatók az
AWK nyelvben. A POSIX szabvány adta őket hozzá, hogy az awk -ot
és az egrep -et konzisztenssé tegyék egymással. Azonban
használatuk valószínűleg tönkreteszi a régi AWK programokat, így
a gawk csak akkor nyújtja azokat, ha ezzel az opcióval kérik,
vagy ha a --posix meg van adva.
-W source program-text
--source program-text
A program-text -et AWK forráskódként használja. Ez az opció
lehetővé teszi a könyvtári függvények ( -f és --file ) könnyű
keverését a parancssorban megadott forráskóddal. Ez elsősorban
shell szkriptekben használt nagy AWK programok közvetítő
közegének van szánva.
-W version
--version
Kiírja az aktuális gawk program verzióját a szabványos
kimenetre. Ez akkor hasznos, ha tudni szeretnénk, hogy a
rendszeren lévő program a legújabb-e, tekintetbe véve mindent,
amit a Szabad Software Alapítvány kiad. Szintén hasznos
hibajelentésekhez. (A GNU Kdolsi Szablyok -nak megfelelően
ezek az opciók azonnali, sikeres kilépést eredményeznek.)
-- Az opciók végét jelzi. Hasznos, ha engedélyezni akarjuk, hogy a
további, magának az AWK programnak átadandó argumentumok ``-''
jellel kezdődjenek. Ez főként a - legtöbb POSIX program által
alkalmazott - argumentum elemzési konvencióval való egyezőség
miatt született.
Kompatíbilis módban a program minden egyéb opciót illegálisként jelöl
meg, egyébként figyelmen kívül hagyja azokat. Rendes működéskor,
mindaddig, amíg szöveget talál, az ismeretlen opciókat feldolgozásra
átadja az AWK programnak az ARGV tömbben. Ez különösen az AWK programok
``#!'' mechanizmussal történő futtatásakor hasznos.
AZ AWK PROGRAM VÉGREHAJTÁSA
Egy AWK program minta-tevékenység utasítások és opcionális
függvénydefiníciók sorozata.
minta { tevkenysg utastsok }
function nv(paramter lista) { utastsok }
A gawk először beolvassa a programforrást a programfile -(ok)ból (ha
meg van adva ilyen), a --source argumentumából, vagy a parancssor első,
nem-opció argumentumából. A -f és a --source opciók többször
használhatók a parancssorban. A gawk ilyenkor úgy olvassa be a program
szövegét, mintha minden programfile és parancssori forrásszöveg össze
volna kapcsolva (konkatenálva). Ez jól használható AWK
függvénykönyvtárak kialakításához. Így nincs szükség a függvények
befoglalására minden olyan új programba, amely használja azokat. Ez
azt is lehetővé teszi, hogy a könyvtári függvényeket a parancssori
programokkal keverjük.
Az AWKPATH környezeti változó előírja a -f opcióval megnevezett fájlok
keresési útvonalát. Ha ez a változó nem létezik, az alapértelmezett
keresési útvonal: ".:/usr/local/share/awk". (A tényleges könyvtár
aszerint változhat, hogy a gawk -ot hogyan fordították és
installálták.) Amennyiben egy, a -f opcióval átadott fájlnév ``/''
karaktert tartalmaz, nem hajtódik végre útvonal-keresés.
A gawk a következő forgatókönyv szeint hajtja végre a programokat.
Először végrehajt minden, a -v opcióval előírt változó-értékadást.
Ezután egy belső formába fordítja a programot, végrehajtja a BEGIN
blokk(ok)ban levő kódot (ha van ilyen), majd beolvas minden, az ARGV
tömbben megadott fájlt. Ha nincs file megnevezve a parancssorban, a
gawk a szabványos bemenetet olvassa.
Ha egy, a parancssorban megadott fájlnév var=val formájú, akkor ezt a
gawk változó-értékadásként kezeli; a var változó megkapja a val
értéket. (Ez azután történik, hogy minden BEGIN block lefutott.) A
parancssori értékadás ott a leghasznosabb, ahol olyan változók értékeit
adjuk meg dinamikusan, amelyek azt írják elő, hogy a bemenetet milyen
módon kell mezőkre és rekordokra bontani. Ez állapot figyelésre is
alkalmas, ha több futás is szükséges egyetlen adatfile-on.
Ha az ARGV egy bizonyos eleme üres értékű (""), a gawk átugorja azt.
A gawk ellenőrzi a bemenet minden rekordját, hogy eldöntse,
illeszkedik-e az AWK program bármely mintjra. Minden olyan mintához
rendelt tevkenysg végrehajtódik, amely mintára a rekord illeszkedik.
A minták a programbeli előfordulás sorrendjében kerülnek vizsgálat alá.
Végül, miután minden bemenetnek a végére ért, a gawk végrehajtja az END
blokk(ok)ban lévő kódot (ha van ilyen).
VÁLTOZÓK, REKORDOK ÉS MEZŐK
Az AWK változók dinamikusak; első használatukkor jönnek létre. Értékük
vagy lebegőpontos, vagy karakterlánc, vagy mindkettő, a használatuk
módjától függően. Az AWK-ban léteznek még egydimenziós tömbök; a
többdimenziósak szimulálhatók. Számos elődefiniált változó kap értéket
egy program futása alatt; ezek leírása és összegzése alább, a szükséges
helyen történik.
Rekordok
Rendszerint a rekordok újsor karakterekkel vannak elválasztva.
Megadható a rekordelválasztás módja az RS nevű beépített változó
értékének hozzárendelésével. Ha RS egyetlen karakter, ez a karakter
lesz a rekordelválasztó. Egyébként RS reguláris kifejezés. Az erre a
reguláris kifejezésre illeszkedő szöveg a rekordelválasztó. Azonban
kompatíbilis módban csak karakterlánc-értékének első karaktere lesz
felhasználva a rekordok szétválasztására. Ha RS üres karakterláncra
van beállítva, akkor a rekordokat üres sorok választják el. Ilyenkor
az újsor karakter mezőelválasztóként viselkedik, bármilyen értékű is
FS.
Mezők
Amint beolvassa az egyes rekordokat, a gawk mezk -re bontja azokat, az
FS változó értékét használva mezőelválasztóként. Ha FS egyetlan
karakter, ez a karakter választja el a mezőket. Ha FS üres
karakterlánc, akkor minden egyes karakter külön mező lesz. Egyébként a
program FS -t, mint reguláris kifejezést kezeli. Abban a speciális
esetben, amikor FS egyetlen space, a mezőket space és/vagy tab és/vagy
újsor karakterek választják el. (De lásd lejjebb a --posix opció
tárgyalását). Fontos, hogy az IGNORECASE értéke (lásd lejjebb) szintén
befolyásolja, hogy a mezők miként választódnak szét, amikor az FS
reguláris kifejezés; és hogy hogyan szeparálódnak a rekordok, amikor az
RS reguláris kifejezés.
Ha a FIELDWIDTHS változó értékeként space-ekkel elválasztott számlista
van megadva, a gawk fix szélességű mezőket vár, és a rekordot az adott
szélességekre darabolja. Az FS értékét figyelmen kívül hagyja. FS-nek
új értéket adva a FIELDWIDTHS használata megszüntethető, és
visszaállítható az alapértelmezett működés.
A bemeneti rekord minden mezőjére pozíciója alapján hivatkozhatunk (
$1, $2, stb.) $0 az egész rekord. A mező értéke meg is adható. A
mezőhivatkozásnak nem szükséges konstansnak lennie:
n = 5
print $n
kiírja a bemeneti rekord ötödik mezőjét. Az NF változó a bemeneti
rekord mezőinek számát tartalmazza.
A nemlétező mezőkre történő hivatkozások (azaz $NF-nél nagyobb indexű
mezők) üres karakterláncot eredményeznek. Azonban a nemlétező mezőnek
történő értékadás (pl. $(NF+2) = 5) megnöveli NF értékét, minden
közbeeső mezőt üres karakterlánc-értékkel hoz létre, és $0 értékét újra
kiértékelteti úgy, hogy a mezőelválasztó OFS értéke lesz. A negatív
mezőhivatkozások fatális hibát okoznak. NF dekrementálása az új érték
utáni mezők értékének elvesztésével jár, valamint $0 értékének
újraszámítását okozza, OFS értékének megfelelő mezőelválasztással.
Beépített változók
A gawk beépített változói:
ARGC A parancssori argumentumok száma (nem tartalmazza a gawk
-nak szóló argumentumokat, vagy a program forráskódját).
ARGIND Az éppen feldolgozás alatt álló file indexe az ARGV
tömbben.
ARGV A parancssori argumentumok tömbje. A tömb indexei 0-tól (
ARGC -1 ) -ig tartanak. Az ARGV tartalmának dinamikus
megváltoztatásával az adatfile-ok csoportja módosítható.
CONVFMT A számok konverziós formátuma. Alapértelmezésben %.6g.
ENVIRON Az aktuális környezetet tartalmazó tömb. A tömb a
környezeti változók nevével van indexelve, minden elem az
adott változó értéke (pl. ENVIRON["HOME"] értéke lehet
/home/valaki ). E tömb megváltoztatása nincs hatással a
gawk -ból átirányítással vagy a system() függvénnyel hívott
programok által látott környezetre. (Ez a gawk jövőbeni
verzióiban változhat.)
ERRNO Ha rendszerhiba történik a getline -ba átirányításkor, a
getline -ba olvasáskor vagy a close() alatt, akkor az ERRNO
tartalmazza a hibát leíró karakterláncot.
FIELDWIDTHS A mezőszélességek szóközökkel elválasztott listája. Ha ez
be van állítva, a gawk rögzített szélességű mezőkre tördeli
a bemenetet, ahelyett, hogy az FS változó, mint
mezőelválasztó értékét használná. A rögzített mezőszélesség
használatának lehetősége még kísérleti jellegű; jelentése
idővel változhat.
FILENAME Az aktuális bemeneti file neve. Ha nincs file megadva a
parancssorban, a FILENAME értéke ``-''. Azonban a FILENAME
nem definiált a BEGIN blokkon belül.
FNR A bemeneti rekord sorszáma az aktuális bemeneti fájlban.
FS A bemeneti mezőelválasztó. Alapértelmezésben szóköz. Lásd
feljebb: Mezők.
IGNORECASE Meghatározza minden reguláris kifejezés és karakterlánc-
művelet esetérzékenységét. Ha az IGNORECASE nem nulla,
akkor a karakterláncok összehasonlítása és a
mintaillesztés, a meződarabolás FS -szel, a rekordok
elválasztása RS -szel, a reguláris kifejezések illesztése ~
-vel és !~ -vel, és a gensub(), gsub(), index(), match(),
split(), valamint a sub(), előre definiált függvények nem
lesznek esetérzékenyek a reguláris kifejezésekkel végzett
műveleteknél. Így, ha az IGNORECASE nem nulla, /aB/
egyaránt illeszkedik az ab, aB, Ab, és AB karakterláncokra.
Mint minden AWK változónak, az IGNORECASE -nek is nulla a
kezdeti értéke, tehát rendesen minden reguláris kifejezés
esetérzékeny. Unix alatt a teljes ISO 8859-1 Latin-1
karakterkészlet használatos az esetérzékenység
elhagyásakor. FONTOS: a 3.0-át megelőző gawk verziókban,
az IGNORECASE csak a reguláris kifejezéssel végzett
műveletekre volt hatással. Ma már befolyásolja a
karakterlánc-összehasonlításokat is.
NF A mezők száma az aktuális bemeneti rekordban.
NR A már beolvasott rekordok teljes összege.
OFMT A számok kimeneti formátuma. Alapértelmezésben %.6g.
OFS A bemeneti mezőelválasztó. Alapértelmezésben szóköz.
ORS A kimeneti rekordelválasztó. Alapértelmezésben újsor
karakter.
RS A bemeneti rekordelválasztó. Alapértelmezésben újsor
karakter.
RT Rekordterminátor. A gawk arra a bemenő szövegre állítja be,
amely illeszkedik az RS által meghatározott karakterre vagy
reguláris kifejezésre.
RSTART Az első, match() által talált karakter indexe; 0, ha nincs
találat.
RLENGTH A match() által talált karakterlánc hossza; -1, ha nincs
találat.
SUBSEP A többindexű tömbelemek indexelválasztó karaktere.
Alapértelmezésben 34.
Tömbök
A tömbök indexei szögletes zárójelben ([ és ]). megadott kifejezések.
Ha a kifejezés egy kifejezéslista (kif, kif ...) akkor a tömbindex az
egyes kifejezések (karakterlánc-)értékének konkatenációjából álló
karakterlánc, ahol az egyes részeket a SUBSEP változó értéke szerinti
karakter választja el. Például:
i = "A"; j = "B"; k = "C"
x[i, j, k] = "hello, world\n"
a "hello, world\n" karakterláncot rendeli az x tömb "A\034B\034C"
karakterlánccal indexelt eleméhez. az AWK-ban minden tömb asszociatív,
azaz karakterláncokkal indexelt.
Az in, különleges operátor használható if és while utasításban annak
eldöntésére, hogy egy tömbben létezik-e egy adott értékből álló index.
if (val in array)
print array[val]
Ha a tömb többindexű, az (i, j) in array forma alkalmazandó.
Az in szerkezet for ciklusban is használható egy tömb minden elemének
eléréséhez.
Egy tömbelem a delete utasítással törölhető. A delete a tömb teljes
tartalmának törlésére is használható, a tömbnév index nélküli
megadásával.
Változótipizálás és konverzió
A változók és mezők lehetnek (lebegőpontos) számok, karakterláncok,
vagy mindkettő. A változó értékének kezelése a környezetétől függ. Ha
numerikus kifejezésben szerepel, számként lesz kezelve, ha
karakterláncként használják, akkor karakterláncként.
Ha kényszeríteni szeretnénk, hogy egy változó számként legyen kezelve,
adjunk hozzá 0-t; ha azt akarjuk, hogy karakterláncként, összefűzzük az
üres karakterlánccal.
Ha egy karakterláncot számmá kell konvertálni, a konverzió az atof(3)
függvénnyel valósul meg. Egy szám karakterlánccá konvertálódik, ha a
CONVFMT értékét, mint az sprintf(3) függvény formázó karakterláncát
használjuk, argumentumként pedig a változó számértékét adjuk meg.
Azonban, jóllehet az AWK-ban minden szám lebegőpontos, az egész értékek
mindig integer-szerűen konvertálódnak. Így
CONVFMT = "%2.2f"
a = 12
b = a ""
a b változó karakterlánc-értéke "12" és nem "12.00".
A gawk a következőképpen hajtja végre az összehasonlítást: ha két
változó numerikus, numerikusan hasonlít össze. Ha az egyik érték
numerikus és a másik karakterlánc-érték, amely ``numerikus
karakterlánc'', akkor az összehasonlítás szintén numerikusan történik.
Egyébként a numerikus érték karakterlánccá konvertálódik és
karakterlánc-összehasonlítás hajtódik végre. Két karakterlánc,
természetesen karakterláncként hasonlítódik össze. A POSIX szabvány
szerint, akkor is numerikus összehasonlítást kell végezni, ha két
karakterlánc numerikus karakterlánc. Azonban ez teljesen helytelen, és
a gawk nem ezt teszi.
Fontos, hogy a karakterlánc konstansok, úgy mint az "57", nem numerikus
karakterláncok; ezek karakterlánc konstansok. A ``numerikus
karakterlánc'' fogalom csak a mezőkre, a getline bemenetre, a FILENAME
-re, az ARGV elemekre, az ENVIRON elemekre és a split() függvénnyel
létrehozott tömb numerikus karakterlánc elemeire vonatkozik. Az
alapgondolat az, hogy a numerikus alakú felhasználói bemenetet, és csak
a felhasználói bemenetet szabad így kezelni.
Az inicializálatlan változók numerikus érteke 0, karakterlánc-értékük
"" (null-, vagy üres karakterlánc).
MINTÁK ÉS TEVÉKENYSÉGEK
Az AWK sororientált nyelv. Előbb jön a minta, majd a tevékenység. A
tevékenység-utasítások { és } közé vannak zárva. Vagy a minta, vagy a
tevékenység elmaradhat, de természetesen mindkettő nem. Ha a minta
hiányzik, a tevékenység minden egyes bemenő rekordon végrehajtódik. A
hiányzó tevékenység ugyanaz, mint a
{ print }
amely kiírja az egész rekordot.
A megjegyzések ``#''-kal kezdődnek és a sor végéig folytatódnak. Üres
sorok használhatók az utasítások elkülönítésére. Rendszerint egy
utasítás az újsor karakterrel befejeződik, de ez nem igaz a ``,'', {,
?, :, &&, vagy || végű sorokra. A do vagy else végű sorokban szereplő
utasítások szintén automatikusan folytatódnak a következő sorban. Más
esetekben a sort a végére írt ``'' karakterrel lehet folytatni. Ekkor
az újsor karaktert a gawk figyelmen kívül hagyja.
Több, ``;''-vel elválasztott utasítás is írható egy sorba. Ez
vonatkozik egyaránt a minta-tevékenység pár tevékenység részében
szereplő utasításokra és magukra a minta-tevékenység utasításokra.
Minták
Az AWK minták a következók lehetnek:
BEGIN
END
/regulris kifejezs/
relcis kifejezs
minta && minta
minta || minta
minta ? minta : minta
(minta)
! minta
minta1, minta2
A BEGIN és az END két speciális minta, amely nem inputfüggő. Minden
BEGIN minta tevékenység része egy egységet képez úgy, mintha minden
utasítás egyetlen BEGIN blokkba volna írva. Ezek előbb végrehajtásra
kerülnek, mielőtt bármilyen bemenet beolvasása megtörténne. Ehhez
hasonlóan az END blokkok is egybeolvadnak, és akkor hajtódnak végre,
amikor minden bemenet beolvasása véget ért (vagy amikor exit utasítás
hajtódik végre). A BEGIN és az END blokkok nem kombinálhatók más
mintákkal a mintakifejezésekben. A BEGIN és az END mintákból nem
hiányozhat a tevékenység rész.
A /regulris kifejezs/ mintákhoz rendelt utasítás minden olyan
rekordra végrehajtódik, amely illeszkedik a reguláris kifejezésre. A
reguláris kifejezések azonosak az egrep(3) programéival. Ezek
összefoglalását lásd lejjebb.
A relcis kifejezsekben szerepelhet bármelyik, a lenti,
tevékenységekről szóló részben definiált operátorok közül. Ezek
rendszerint azt ellenőrzik, hogy bizonyos mezők illeszkednek-e bizonyos
reguláris kifejezésekre.
Az &&, ||, és ! operátorok rendre a logikai ÉS, logikai VAGY és
logikai NEM, mint a C-ben. Rövidzár kiértékelést végeznek, szintén,
mint a C-ben. Egyszerűbb mintakifejezések összekapcsolására szolgálnak.
Mint a legtöbb nyelvben, zárójelek használhatók a kiértékelés
sorrendjének megváltoztatására.
A ?: operátor hasonlít a C ugyanezen operátorához. Ha az első minta
igaz, akkor a második minta kerül felhasználásra az ellenőrzéshez,
egyébként a harmadik. A második és harmadik minta közül csak az egyik
értékelődik ki.
A minta1, minta2 kifejezésforma neve tartomnyminta. Ez illeszkedik a
minta1 -re illeszkedő rekorddal kezdve folytatólagosan minden bemenő
rekordra, egy, a minta2 -re illeszkedő rekordig - beleértve a két
határmintára illeszkedő rekordokat. Nem működik együtt másfajta
mintakifejezésekkel.
Reguláris kifejezések
A reguláris kifejezések az egrep -ben megtalálható kibővített típusúak.
A következő karakterekből állnak:
c a nem-metakarakter c-re illeszkedik.
\c a literális c karakterre illeszkedik. . minden karakterre
illeszkedik, belertve az újsort.
^ egy karakterlánc kezdetére illeszkedik.
$ egy karakterlánc végére illeszkedik.
[abc...] karakterlista, amely az abc... karakterek bármelyikére
illeszkedik.
[^abc...] negált karakterlista, minden karakterre illeszkedik, kivéve
abc... -t.
r1|r2 vagylagosság: r1 -re vagy r2 -re illeszkedik.
r1r2 összekapcsolás: az r1 és r2 sorozatra illeszkedik.
r+ egy vagy több r -re illeszkedik.
r* nulla vagy több r -re illeszkedik.
r? nulla vagy egy r -re illeszkedik.
(r) csoportosítás: r -re illeszkedik. r.
r{n}
r{n,}
r{n,m} Egy vagy két szám kapcsos zárójelek között intervallum-
kifejezst jelent. Ha egy szám szerepel a zárójelek között,
az előtte álló r reguláris kifejezés n -szer megismétlődik.
Ha két szám van zárójelezve, vesszővel elválasztva, r n és m
közötti számszor ismétlődik meg. Ha egy számot követ
vessző, ez r legalább n -szeri ismétlését jelzi.
Az intervallum-kifejezések csak akkor használhatók, ha a
parancssorban --posix vagy --re-interval opciót jelölünk
meg.
\y egy szó elején vagy végén álló üres karakterláncra
illeszkedik.
\B egy szón belüli üres karakterláncra illeszkedik.
\< egy szó elején álló üres karakterláncra illeszkedik.
\> egy szó végén álló üres karakterláncra illeszkedik.
\w minden szóalkótó karakterre (betű, szám, aláhúzás)
illeszkedik.
\W minden nem-szóalkótó karakterre illeszkedik.
\` egy puffer (karakterlánc) elején álló üres karakterláncra
illeszkedik.
\' egy puffer végén álló üres karakterláncra illeszkedik.
A karakterlánc konstansokban érvényes escape szekvenciák (lásd lejjebb)
szintén használhatók a reguláris kifejezésekben.
A karakterosztly a POSIX szabványban bevezetett új lehetőség. A
karakterosztály egy speciális jelölés adott attribútumú karakterek
leírásához, ahol viszont a tulajdonképpeni karakterek ország és ország
és/vagy karakterkészlet és karakterkészlet között mások lehetnek.
Például az alfabetikus karakter fogalma mást jelent az USA-ban és mást
Franciaországban.
A karakterosztályok csak a karakterlista szögletes zárójelein belli
reguláris kifejezésben használhatók. Formájuk: [:, az osztályt jelölő
kulcsszó és :]. Íme a POSIX szabványban definiált karakterosztályok.
[:alnum:]
Alfanumerikus karakterek.
[:alpha:]
Alfabetikus karakterek.
[:blank:]
Space vagy tab karakterek.
[:cntrl:]
Vezérlő karakterek.
[:digit:]
Numerikus karakterek.
[:graph:]
Látható és nyomtatható karakterek. (A space nyomtatható, de nem
látható, míg egy a mindkettő.)
[:lower:]
Kisbetűs alfabetikus karakterek.
[:print:]
Nyomtatható karakterek (nem vezérlő karakterek.)
[:punct:]
Írásjelek (nem betű-, szám-, vezérlő vagy space karakterek).
[:space:]
Space karakterek (úgy mint például space, tab és lapdobás).
[:upper:]
Nagybetűs alfabetikus karakterek.
[:xdigit:]
Hexadecimális számkarakterek.
Példának okáért, a POSIX szabvány előtt, az alfanumerikus karakterekre
illeszkedést a /[A-Za-z0-9]/ leírásával lehetett volna elérni. Ha
karakterkészletünkben egyéb alfabetikus karakterek is vannak, ez nem
fog illeszkedni rájuk. A POSIX karakterosztályt használva a
/[[:alnum:]]/ forma illeszkedni fog a karakterkészlet minden
alfabetikus és numerikus karakterére.
Két további speciális szekvencia is megjelenhet a karakterlistákban.
Ezek nem-ASCII karakterkészletekre vonatkoznak, amelyeknek lehetnek
olyan szimbólumaik ( egybeolvasott elemek ), amelyek több, mint egy
karakterrel vannak ábrázolva, és számos olyan karakter is, amelyek
összehasonlító vagy rendező szempontból egyenértékűek. (Pl. a francia
nyelvben a sima ``e'' és a tompaékezetes e` egyenértékűek.)
Egybeolvasott szimbólumok
Az egybeolvasott szimbólum egy többkarakteres egybeolvasott
elem, amely [. és .] közé van zárva. Például, ha ch egy
egybeolvasott elem, akkor [[.ch.]] az a reguláris kifejezés,
amely illeszkedik rá, míg a [ch] reguláris kifejezés c-re, vagy
h-ra illeszkedik.
Ekvivalenciaosztályok
Az ekvivalenciaosztály ekvivalens karakterek listájának helyileg
definiált neve. A név [= és =] közé van zárva. Például az e név
használható volna az ``e'', ``e''' és ``e`'' mindegyikének
ábrázolására. Ebben az esetben a [[=e=]] olyan reguláris
kifejezés, amely e-re e'-re és e`-re is illeszkedik.
Ezek a szolgáltatások igan hasznosak a nem angolul beszélő területeken.
A gawk által a reguláris kifejezések illesztéséhez használt könyvtári
függvények jelenleg csak a POSIX karakterosztályokat ismerik fel; nem
kezelik az egybeolvasott szimbólumokat vagy az ekvivalenciaosztályokat.
A \y, \B, \<, \>, \w, \W, \`, és \' operátorok gawk-specifikusak; a GNU
reguláris kifejezés könyvtárainak szolgáltatásaira épülő bővítések.
A számos parancsssori opció azt szabályozza, hogy a
hogyan kezelje a reguláris kifejezésekben szereplő karaktereket.
Nincs opció
Alapesetben a gawk a POSIX reguláris kifejezések és a fent leírt
GNU reguláris kifejezés operátorok minden szolgáltatását
nyújtja. Azonban az intervallum-kifejezések nincsenek
támogatva.
--posix
Csak a POSIX reguláris kifejezések támogatottak, a GNU
operátorok nem definiáltak. (Pl. a \w a literális w-re
illeszkedik). Az intervallum-kifejezések engedélyezettek.
--traditional
A hagyományos Unix awk reguláris kifejezései működnek. A GNU
operátorok nem definiáltak, az intervallum-kifejezések nem
elérhetők és a POSIX karakterosztályok sem ([[:alnum:]] stb). Az
oktális vagy hexadecimális escape szekvenciákkal megadott
karakterek kezelése literális, még ha reguláris kifejezés
metakaraktereket ábrázolnak is.
--re-interval
Engedélyezi az intervallum-kifejezéseket a reguláris
kifejezésekben, még ha a --traditional opció meg is van adva.
Tevékenységek
A tevékenységek utasításai { és } közé vannak zárva. A más nyelvekben
meglévő, megszokott értékadó, feltételes és ciklusutasításokból állnak.
A használható operátorok, vezérlő utasítások és bemeneti/kimeneti
utasítások a C-beli megfelelőkről vannak mintázva.
Operátorok
Az AWK operátorai csökkenő precedencia szerint:
(...) Csoportosítás.
$ Mezőhivatkozás.
++ -- Inkrementálás és dekrementálás, mindkettő prefix és
postfix.
^ Hatványozás (** szintén használható, **= pedig értekadó
operátorként).
+ - ! Egyoperandusú plusz/mínusz és logikai tagadás.
* / % Szorzás, osztás és maradékképzés.
+ - Összeadás és kivonás.
space Karakterláncok összekapcsolása (konkatenáció).
< >
<= >=
!= == A megszokott relációs operátorok.
~ !~ Reguláris kifejezés illeszkedése, nem-illeszkedése.
FONTOS: Ne használjunk konstans reguláris kifejezést
(/foo/) ~ vagy !~ baloldalán, csakis a jobbon! A /foo/ ~
exp kifejezés jelentése ugyanaz, mint a (($0 ~ /foo/) ~
exp) kifejezésé. Rendszerint nem ezt várják.
in Tömbhöz tartozás.
&& Logikai ÉS.
|| Logikai VAGY.
? : A C feltételes kifejezése. Ennek formája kif1 ? kif2 :
kif3. Ha kif1 igaz, a kifejezés értéke kif2, egyébként
kif3. Csak egy értékelődik ki kif2 és kif3 közül.
= += -=
*= /= %= ^= Értékadás. Úgy az abszolút értékadás (var = value) mint az
operátor-értékadás (a többi forma) egyaránt támogatott.
Vezérlő utasítások
A vezérlő utasítások a következők:
if (felttel) utasts [ else utasts ]
while (felttel) utasts
do utasts while (felttel)
for (kif1; kif2; kif3) utasts
for (var in array) utasts
break
continue
delete array[index]
delete array
exit [ kifejezs ]
{ utastsok }
Bemeneti/kimeneti utasítások
A bemeneti/kimeneti utasítások a következők:
close(file) Lezárja a fájlt (vagy csatornát, lásd lenn).
getline $0 értékét a következő bemeneti rekordból veszi;
beállítja NF, NR, FNR értékét.
getline <file $0 értékét file következő bemeneti rekordjából
veszi; beállítja NF értékét.
getline var var értékét a következő bemeneti rekordból veszi;
beállítja NF, FNR értékét.
getline var <file var értékét file következő rekordjából veszi.
next Abbamarad az aktuális rekord feldolgozása.
Megtörténik a következő bemeneti rekord
beolvasása és a feldolgozás az AWK program első
mintájával kezdődik. Ha a végrehajtás elérte a
bemeneti adatok végét, az END blokk(ok) (ha
van(nak)) kerülnek végrehajtásra.
nextfile Abbamarad az aktuális bemeneti file feldolgozása.
A következő bemeneti rekord a következő fájlból
érkezik. FILENAME és ARGIND aktualizálódik, FNR
értéke 1-re áll be, és a feldolgozás az AWK
program első mintajával kezdődik. Ha a
vegrehajtás elérte a bemeneti adatok végét, az
END blokk(ok) (ha van(nak)) kerülnek
végrehajtásra. FONTOS: A gawk korábbi verziói a
next file -t két szóban használták. Noha még
felismeri ezt a használati módot, figyelmeztető
üzenetet generál és előbb-utóbb elhagyásra kerül.
print Kiírja az aktuális rekordot. A kimeneti rekord az
ORS változó értékével fejeződik be.
print expr-list Kiírja a kifejezések értékét. Minden kifejezés az
OFS változó értékével választódik el. A kimeneti
rekord az ORS változó értékével fejeződik be.
print expr-list >file A file-ba írja a kifejezések értékét. Minden
kifejezés az OFS változó értékével választódik
el. A kimeneti rekord az ORS áltozó értékével
fejeződik be.
printf fmt, expr-list Formáz és kiír.
printf fmt, expr-list >file
Formáz és a file-ba ír.
system(cmd-line) Végrehajtja a cmd-line parancsot, és visszatér az
exit státusszal. (Ez lehet, hogy nem használható
nem-POSIX rendszerekben.)
fflush([file]) Lemezre ír minden, a nyitott kimeneti vagy
csatorna file -hoz rendelt puffert. Ha a file
paraméter nincs megadva, a szabványos kimenetre
ír. Ha file üres karakterlánc, akkor minden
nyitott kimeneti és csatorna file puffere
kiíródik.
Egyéb kimeneti/bemeneti átirányítások is megengedettek. A print -re és
printf -re vonatkozóan a >>file a kimenetet a file végére írja, míg a |
parancs csatornába ír. Ehhez hasonlóan a parancs | getline getline-ba
irányít át. A getline parancs 0-val tér vissza a file végénél és
-1-gyel hiba esetén.
A printf utasítás
A printf utasítás és sprintf() függvény (lásd lenn) AWK verziója a
következő konverziós karaktereket fogadja el:
%c Egy ASCII karakter. Ha %c -hez rendelt argumentum numerikus, a
gawk karakterként kezeli és kiírja. Egyébként feltételezi, hogy
az argumentum karakterlánc, és csak a karakterlánc első
karakterét írja ki.
%d
%i Decimális szám (az egészrész).
%e
%E [-]d.dddddde[+-]dd formájú lebegőpontos szám. A %E -s forma E -t
használ e helyett.
%f [-]ddd.dddddd formájú lebegőpontos szám.
%g
%G A %e vagy %f konverziók közül a rövidebbet alkalmazza. Az
értéktelen nullákat elhagyja. A %G -s forma %E -t alkalmaz %e
helyett.
%o Jelöletlen oktális szám (megint csak egész).
%s Karakterlánc.
%x
%X Jelöletlen hexadecimális szám (egész). A %X -es forma ABCDEF -et
használ abcdef helyett.
%% Egy % karakter; argumentumot nem konvertál.
Léteznek további, opcionális paraméterek, amelyek a % és a
vezérlőkarakter között állhatnak:
- A kifejezésnek a mezőben balra igazítva kell megjelennie.
space Numerikus konverziókban space-et ír a pozitív, mínusz jelet a
negatív kifejezések elé.
+ A plusz jel - a szélességmódosító előtt (lásd lejjebb) használva
- előírja, hogy a numerikus konverziókban mindig előjelet kell
írni, akkor is, ha a formázott szám pozitív. A + felülbírálja a
space jelzőt.
# ``Alternatív forma'' használata bizonyos vezérlő betűkhöz. A %o
-hoz bevezető 0-t ad. A %x -hez és %X -hez bevezető 0x -et vagy
0X -et ad, ha az eredmény nem nulla. A %e, %E és %f esetében az
eredmény mindig tartalmazni fog tizedespontot. A %g -nél és %G
-nél a számvégi nullák nem maradnak ki az eredményből.
0 A bevezető 0 jelzőként működik, amely azt mutatja, hogy a
kimenetben a bevezető space-ek helyett nullák legyenek. Ez a
nem-numerikus kimenetek formázására is vonatkozik. Ennek a
jelzőnek csak akkor van hatása, amikor a mező szélesebb, mint a
kiírandó szöveg.
width A mezőt ilyen szélességűre kell feltölteni. A feltöltés
rendszerint space-ekkel történik. Ha a 0 jelzőt használjuk,
nulla lesz a kitöltő karakter.
.prec Szám, amely meghatározza a kiíráskor alkalmazandó pontosságot. A
%e, %E és %f formák esetében ez határozza meg a tizedespont jobb
oldalán kiírni kívánt jegyek számát. A %g és %G formáknál ez az
értékes jegyek maximális számát adja meg. A %d, %o, %i, %u, %x
és %X formák esetében ez a kiírandó jegyek maximális számát
határozza meg.
Az ANSI C printf() rutinjainak dinamikus szlessg és pontossg
szolgáltatásai támogatottak. Egy * a width vagy prec előírások helyén
azt eredményezi, hogy értéküket a printf vagy sprintf()
argumentumlistájából veszik.
Különleges fájlnevek
Amikor akár print -ből, akár printf -ből bemeneti/kimeneti átirányítást
végzünk egy fájlba, a gawk felismer néhány speciális fájlnevet. Ezek
elérhetővé teszik a szülő processzből (ez rendszerint a shell) örökölt
nyitott fájldeszkriptorokat. Más különleges fájlnevek a futó gawk
processzről szóló információhoz szolgáltatnak elérést. Ezek a
fájlnevek:
/dev/pid E file olvasása visszaadja az aktuális processz újsorral
terminált, decimális azonosítóját.
/dev/ppid E file olvasása visszaadja a szülő processz újsorral
terminált, decimális azonosítóját.
/dev/pgrpid E file olvasása visszaadja az aktuális processz újsorral
terminált, decimális csoportazonosítóját.
/dev/user E file olvasása egy, újsorral terminált rekordot ad vissza.
A mezők space-szel vannak elválasztva. $1 a getuid(2)
rendszerhívás értéke, $2 a geteuid(2) rendszerhívás értéke,
$3 a getgid(2) -é és $4 a getegid(2) -é. Ha további mező
fordul elő, akkor azok a getgroups(2) által visszaadott
group ID-k. Lehet, hogy a többcsoportúságot nem minden
rendszer támogatja.
/dev/stdin A szabványos bemenet.
/dev/stdout A szabványos kimenet.
/dev/stderr A szabványos hibakimenet.
/dev/fd/n A nyitott n file-deszkriptorhoz rendelt file.
Ezek különösen hibaüzenetek szempontjából fontosak. Például:
print "A gépnek annyi!" > "/dev/stderr"
ahol egyébként a következő formát kellene használni:
print "A gépnek annyi!" | "cat 1>&2"
Ezek a fájlnevek a parancssorban is felhasználhatók adatfile-ok
megnevezésére.
Numerikus függvények
Az AWK a következő elődefiniált aritmetikai függvényekkel rendelkezik:
atan2(y, x) visszaadja radiánban y/x arkusz tangensét. cos(expr)
visszaadja expr radián koszinuszát.
exp(expr) az exponenciális függvény.
int(expr) egészrészre csonkol.
log(expr) természetes alapú logaritmus függvény.
rand() visszaad egy véletlenszámot 0 és 1 között.
sin(expr) visszaadja expr radián szinuszát.
sqrt(expr) a négyzegyökfüggvény.
srand([expr]) expr értékét használja a véletlenszámgenerátor
inicializálására. Ha expr nincs megadva, az időt
használja. A visszatérési érték a véletlenszám-generátor
korábbi inicializáló értéke.
Karakterlánc-függvények
A gawk a következő elődefiniált karakterlánc függvényekkel rendelkezik:
gensub(r, s, h [, t]) a t tárgykarakterláncban keresi r reguláris
kifejezést. Ha h g vagy G kezdetű karakterlánc,
akkor r minden illeszkedését s -re cseréli.
Egyébként h egy szám, amely azt jelzi, hogy r
melyik illeszkedését kell lecserélni. Ha t
nincs megadva, $0 -t alkalmazza. Az s
csereszövegben a \n, szekvencia (ahol n egy, 0
és 9 közötti számjegy) használható a csak az n
-edik zárójelezett al-kifejezésre illeszkedő
szöveg jelölésére. A \0 szekvencia az egész
illeszkedő szöveget jelképezi, csakúgy mint az
& karakter. Eltérően a sub() és gsub()
függvényektől, a visszatérési érték a
módosított karakterlánc, az eredeti
tárgykarakterlánc pedig nem módosul.
gsub(r, s [, t]) t karakterlánc minden r reguláris kifejezésre
illeszkedő alkarakterláncát s karakterláncra
cseréli és visszaadja a helyettesítések számát.
Ha t nincs megadva, $0 -ban keres. Egy & jel a
csereszövegben az illeszkedő szöveggel
helyettesítődik, literális & eléréséhez \&
forma alkalmazandó. Az & és backslash jelek
csereszövegekbeni alkalmazási szabályairól a
sub(), gsub() és gensub() függvényekben bővebb
leírás olvasható az AWK Language Programming c.
könyvben.
index(s, t) visszaadja t karakterlánc s karakterláncbeli
indexét vagy 0-t, ha t nem szerepel s -ben.
length([s]) visszatér s karakterlánc hosszával (vagy $0
-éval, ha s nincs megadva).
match(s, r) visszaadja r reguláris kifejezés s -ben
elfoglalt helyét (vagy 0-t, ha r nem szerepel
benne), és beállítja RSTART és RLENGTH értékét.
split(s, a [, r]) r regurális kifejezés alapján a t tömbbe
darabolja az s karakterláncot és visszatér a
mezők számával. Ha r elmarad, FS -t használja.
A darabolás a - fent leírt - mezőkre bontással
megegyezően történik.
sprintf(fmt, expr-list) a fmt -nak megfelelően kiírja a kifejezslistt
és visszatér az eredmény-karakterlánccal.
sub(r, s [, t]) mint a gsub() függvény, de csak az első
illeszkedést cseréli.
substr(s, i [, n]) visszaadja s karakterlánc i-nél kezdődő,
legfeljebb n karakteres alkarakterláncát. Ha n
nincs megadva, s teljes maradékát alkalmazza.
tolower(str) visszatér str karakterlánc másolatával,
amelyben minden nagybetűt a megfelelő kisbetűre
alakít. A nem-alfabetikus karakterek nem
változnak.
toupper(str) visszatér str karakterlánc másolatával,
amelyben minden kisbetűt a megfelelő nagybetűre
alakít. A nem-alfabetikus karakterek nem
változnak.
Időfüggvények
Mivel az AWK programok egyik elsődleges felhasználási területe a log
fájlok feldolgozása - amelyek időadatot tartalmaznak -, a gawk a
következő két függvényt nyújtja az időadatok kinyeréséhez és
formázásához:
systime() visszaadja az Epoch (POSIX rendszereken 1970. jan. 1.
00:00:00) óta másodpercekben eltelt időt.
strftime([format [, timestamp]])
az időadatot a formátumnak megfelelően formázza. Az
időadatnak a systime() által visszaadott formával
megegyezőnek kell lennie. Ha a formátum hiányzik, a date(1)
parancs kimenetével megegyező, alapértelmezett formátumot
alkalmaz. A biztosan használható formátum konverziókat lásd
az ANSI C strftime() függvényének specifikációjánál. A gawk
-kal jár az strftime(3) függvény public-domain verziója és az
ahhoz tartozó man lap. Ha a gawk fordításakor ezt a verziót
használták, akkor a man lapban leírt minden konverzió
elérhető a gawk számára.
Karakterlánc állandók
Az AWK karakterláncai dupla idézőjelek (") közé zárt karaktersorozatok.
A gawk bizonyos escape szekvencikat felismer a karakterláncokban.
Ezek:
\\ Literális backslash.
\a Az "alert" karakter; rendszerint az ASCII csengő (ASCII BEL)
karakter.
\b Backspace.
\f Lapdobás.
\n Újsor.
\r Kocsivissza.
\t Vízszintes tabulátor.
\v Függőleges tabulátor.
\x hexa jegyek
A \x -et követő hexadecimális számmal jelzett karakter. Mint az
ANSI C-ben, az utána álló minden hexadecimális jegy az escape
szekvencia részeként kerül feldolgozásra. (Ez a jellemző kell hogy
mondjon valamit a bizottsági nyelvtervezésről.) Pl. az "\x1B" az
ASCII ESC (escape) karakter.
\ddd Az egy-, két-, vagy háromjegyű oktális számnak megfelelő karakter.
Pl. az "\033" az ASCII ESC (escape) karakter.
\ c A literális c karakter.
Az escape szekvenciák konstans reguláris kifejezésekben szintén
használhatók (pl. /[ \t\f\n\r\v]/ whitespace karakterekre
illeszkedik).
Kompatíbilis módban az oktális vagy hexadecimális escape szekvenciákkal
jelölt karakterek literálisan kerülnek feldolgozásra a regurális
kifejezés konstansokban. Így a /a\52b/ ugyanaz, mint a /a\*b/.
FÜGGVÉNYEK
Az AWK függvényei a következőképpen definiálandók:
function nv(paramterlista) { utastsok }
A függvények végrehajtása akár mintából, akár tevékenységből való
meghívásukkor történik meg. A függvényhívásokban megadott aktuális
paraméterek a függvényekben deklarált formális paramétereknek adnak
konkrét értéket. A tömbök átadása hivatkozás szerinti, a többi
paraméteré érték szerinti.
Mivel a függvények eredetileg nem voltak az AWK nyelv részei, a lokális
változók eléggé suta módon adhatók meg: a paraméterlistában extra
paraméterekként deklarálandók. A konvenció az, hogy a paraméterlistában
a lokális változókat extra space-ekkel választják el a valódi
paraméterektől. Például:
function f(p, q, a, b) # a és b lokális
{
.....
}
/abc/ { ... ; f(1, 2) ; ... }
A függvényhívás bal oldali zárójelének közvetlenül kell követnie a
függvénynevet, whitespace nem lehet közöttük. Ez a konkatenációs
operátorral való összekeverés elkerülése miatt van így. A megkötés nem
vonatkozik a fent felsorolt beépített függvényekre.
A függvények hívhatják egymást és lehetnek rekurzívak. A lokális
változóként használt függvényparaméterek üres karakterlánc és zéró
számértékkel inicializálódnak a függvényhívás során.
Ha a --lint opció meg van adva, a gawk fordítási és nem futási időben
figyelmeztet a definiálatlan függvények hívása esetén. Futási időben
egy definiálatlan függvény meghívása fatális hiba.
A func kulcsszó használható a function helyén.
PÉLDÁK
Az összes felhasználó login nevének rendezése és kiírása:
BEGIN { FS = ":" }
{ print $1 | "sort" }
Egy file sorainak megszámlálása:
{ nlines++ }
END { print nlines }
A file minden sora elé a sorszám kiírása:
{ print FNR, $0 }
A sorszám konkatenációja (egy témavariáció):
{ print NR, $0 }
LÁSD MÉG
egrep(1), getpid(2), getppid(2), getpgrp(2), getuid(2), geteuid(2),
getgid(2), getegid(2), getgroups(2)
The AWK Programming Language, Alfred V. Aho, Brian W. Kernighan, Peter
J. Weinberger, Addison-Wesley, 1988. ISBN 0-201-07981-X.
AWK Language Programming, Edition 1.0, published by the Free Software
Foundation, 1995.
POSIX KOMPATIBILITÁS
A gawk egyik elsődleges célja a POSIX szabvánnyal - csakúgy, mint a
UNIX awk legújabb verziójával - való kompatibilitás. E célból a gawk
egyesíti a következő, felhasználó által látható szolgáltatásokat,
amelyeket nem ír le az AWK könyv, de részei a Bell Labs awk
verziójának, és a POSIX szabványnak.
Új dolog a -v opció a programvégrehajtás megkezdése előtti
változó-értékadáshoz. A könyv azt jelzi, hogy a parancssori értékadás
akkor történik meg, amikor az awk egyébként fájlként nyitná meg az
argumentumot - amely a BEGIN blokk végrehajtása után valósul meg.
Azonban a korai megvalósításokban, amikor ilyen értékadás jelent meg
fájlnevek előtt, az megtörtént, mieltt a BEGIN blokk lefutott volna.
Programok váltak ettől a ``szolgáltatástól'' függővé. Amikor az awk -ot
a dokumentációjához igazították, ezt az opciót adták hozzá, hogy
alkalmazkodjon a régi viselkedéstől függő alkalmazásokhoz. (E
szolgáltatással szemben nem volt ellenvetés sem az AT&T, sem a GNU
fejlesztői részéről.)
Az alkalmazás specifikus szolgáltatásokhoz tartozó -W opció a POSIX
szabványból ered.
Az argumentumok feldolgozása során a gawk a ``--'' speciális opciót
használja az argumentumok végének jelzéséhez. Kompatíbilis módban
figyelmeztet a definiálatlan opciókra, másrészről viszont figyelmen
kívül hagyja azokat. Rendes működéskor az ilyen argumentumok átadódnak
az AWK programnak, hogy az dolgozza fel őket.
Az AWK könyv nem definiálja az srand() visszatérési értékét. A POSIX
szabvány szerint az inicializáló értéket adja vissza, lehetővé téve a
véletlenszám-sorozatok nyomonkövetését. Ezért a gawk srand() függvénye
szintén az említett számmal tér vissza.
További új szolgáltatások: Több -f opció használata (az MKS awkból); az
ENVIRON tömb; a \a és \v escape szekvenciák (eredetileg a gawk -ban,
majd onnan áttéve az AT&T awk -jába); a tolower() és toupper()
beépített függvények (az AT&T-ből); és a printf ANSI C konverziós
szabályai (először az AT&T verzióban).
GNU BŐVÍTÉSEK
A gawk számos szolgáltatással kibővíti a POSIX awk -ot. Ezek leírása
ebben a részben szerepel. Minden itt felsorolt bővítés kikapcsolható a
gawk --traditional opció hívásával.
A gawk következő szolgáltatásai nem érhetők el a POSIX awk -ban:
o A \x escape szekvencia. (A --posix kikapcsolja).
o Az fflush() függvény. (A --posix kikapcsolja).
o A systime(), strftime() és gensub() függvények.
o A bemeneti/kimeneti átirányításra használt különleges
fájlneveket nem ismeri fel.
o Az ARGIND, ERRNO és RT változóknak nincs speciális jelentésük.
o Az IGNORECASE változó és annak mellékhatásai nem érhetők el.
o A FIELDWIDTHS változó és a rögzített szélességű meződarabolás.
o Az RS változó reguláris kifejezésként való használata.
o Egyes karakterekre szétvágás az FS változó vagy a split()
harmadik argumentumának üres karakterláncra állításával.
o Nincs elérési út bejárás a -f opcióval megadott fájlok
megtalálásához. Tehát az AWKPATH környezeti változónak nincs
különleges jelentése.
o Az aktuális file feldolgozásának megszüntetésére használt
nextfile utasítás.
o A delete array használata egy teljes tömb törléséhez.
Az AWK könyv nem definiálja a close() függvény visszatérési értékét. A
gawk close() függvénye az fclose(3) vagy pclose(3) függvénytől kapott
értéket adja vissza, amikor egy fájlt illetve csatornát lezár.
A gawk --traditional opcióval történő hívásakor - ha a -F opciónak
adott fs értéke ``t'' - az FS értéke a tab karakter lesz. Fontos, hogy
a gawk -F\t ... megadása egyszerűen a shell ``t''-re hivatkozását
eredményezi, és nem ad át ``\t''-t a -F opciónak. Mivel ez egy
meglehetősen csúnya, speciális eset, nem ez az alapértelmezett
viselkedés. Szintén nem ez történik, ha a --posix opció meg van adva.
Hogy igazán a tab karaktert kapjuk mező-elválasztóként, a legjobb, ha
aposztrófot használunk: gawk -F'\t' ....
TÖRTÉNELMI SZOLGÁLTATÁSOK
A történelmi AWK megvalósításoknak két szolgáltatását támogatja a gawk.
Először: lehetőség van a length() beépített függvény nem csak
argumentumok, hanem zárójelek nélküli hí- vására is. Ilyenformán az
a = length # Holy Algol 60, Batman!
ugyanaz, mint bármelyik az
a = length()
a = length($0)
közül. Ezt a lehetőséget ``helytelenítik'' a POSIX szabványban, és a
gawk figyelmeztető üzenetet jelenít meg, ha a --lint opció meg van adva
a parancssorban.
A másik szolgáltatás a continue vagy break utasítás használata while,
for vagy do ciklus törzsén kívül. A tradícionális AWK megvalósítások
ezt a használatot a next utasítással egyenértékűként kezelték. A gawk
--traditional megadása esetén támogatja ezt a használatot.
KÖRNYEZETI VÁLTOZÓK
Ha a POSIXLY_CORRECT környezeti változó létezik, akkor a gawk pontosan
úgy viselkedik, mintha a --posix volna megadva a parancsssorban. Ha a
--lint meg van adva, a gawk figyelmeztető üzenetet küld erről a
hatásról.
Az AWKPATH környezeti változó használható olyan könyvtárak megadására,
amelyeket a gawk bejár a -f és --file opcióval megadott fájlok
megkeresése érdekében.
HIBÁK
A -F opcióra nincs szükség, adva lévén a parancsori változó-értékadás
lehetősége; csupán a kompatibilitás fenntartása miatt marad.
Ha a rendszer támogatja a /dev/fd, és az összerendelt /dev/stdin/,
/dev/stdout és /dev/stderr file-okat, lehet, hogy más lesz a kimenet,
mint ezen fájlok nélküli rendszereken. Amikor a gawk belül emulálja
ezeket a fájlokat, összehangolja a szabványos kimenetre küldött
kimenetet a /dev/out-ba küldött kimenettel; míg az ilyen fájlokkal
rendelkező rendszereken a kimenet lényegében más fájlokba megy.
Vigyázz, Vásárló!
Szintaktikailag érvénytelen egykarakteres programok valószínűleg
túlcsordulnak az elemző vermen, és meglehetősen semmitmondó üzenetet
generálnak. Az ilyen programokat meglepően nehéz teljesen általános
esetben felismerni, és igazán nem éri meg ilyenirányú erőfeszítéseket
tenni.
VERZIÓ
Ez a man lap a 3.0.2-es verziószámú gawk -ot dokumentálja.
SZERZŐK
A UNIX awk eredeti verzióját Alfred Aho, Peter Weinberger és Brian
Kernighan tervezte és vitelezte ki a AT&T Bell Labs-nál. Brian
Kernighan továbbra is javítja és fejleszti.
A gawkot Paul Rubin és Jay Fenlason írta a Szabad Software
Alapítványnál úgy, hogy kompatíbilis legyen a Seventh Edition UNIX-ban
közzétett eredeti awk verzióval. John Woods számos hibajavítással
járult hozzá. David Trueman - Arnold Robbins támogatásával -
kompatíbilissá tette az awk -ot a UNIX awk új verziójával. Arnold
Robbins a jelenlegi karbantartó.
Az eredeti DOS-os változatot Conrad Kwok és Scott Garfinkle
készítette. A jelenlegi DOS-os karbantartó Scott Deifik. Pat Rankin
munkája a VMS változat, és Michal Jaegermanné az Atari ST-s. Az OS/2-es
változatot Kai Uwe Rommel készítette Darrel Hankerson támogatásával és
segítségével. Fred Fish szolgáltatta az Amiga támogatást.
HIBAJELENTÉS
Ha hibát találsz a gawk -ban, kérünk, küldj egy e-mailt a bug-gnu-
utils@prep.ai.mit.edu címre, és cc-zd azt az arnold@gnu.ai.mit.edu
-hoz. Kérünk, mellékeld az operációs rendszered nevét és verziószámát,
a gawk verziószámát, hogy milyen C fordítót használtál a fordításához,
és egy minél kisebb tesztprogramot és adatsort a probléma
reprodukálásához.
Mielőtt hibajalentést küldenél, kérünk, tégy meg két dolgot. Először:
ellenőrizd, hogy a gawk legújabb verziója van-e meg. Sok hiba
(rendszerint hajszálnyiak) kerül kijavításra minden verzióban, és ha a
tiéd elavult, lehet, hogy a problémát már megoldották. Másodszor:
olvasd el figyelmesen a man lapot és a referenciakönyvet, hogy
megbizonyosodj róla, hogy amit hibának gondolsz az valóban hiba, és nem
csak egy hirtelen fordulat a nyelvben.
Bármit is teszel, NE küldj hibajalantést a comp.lang.awk címre.
Jóllehet a gawk fejlesztői alkalmanként olvassák ezt a hírcsoportot, a
hibajelentések oda postázása megbízhatatlan módja a hibajelentésnek.
Ehelyett, kérünk, használd a fent megadott e-mail címeket.
KÖSZÖNETNYILVÁNÍTÁS
A Bell Labsnél dolgozó Brian Kernighan értékes segítséget nyújtott a
tesztelés és hibajavítás alatt. Köszönjük neki.
MÁSOLÁSI JOGOK
Copyright (C)) 1996 Free Software Foundation, Inc.
Mindenki számára engedélyezzük, hogy teljes másolatot készítsenek és
terjesszenek erről az iratról, azzal a kikötéssel, hogy a copyright
megjegyzés és ez az engedély fel legyen tüntetve minden másolaton.
Engedélyezzük, hogy ezen irat megváltoztatott verzióit másolják és
terjesszék - a teljes másolatra vonatkozó kikötéssel - , feltéve, hogy
a teljes leszármazott munka ezzel a copyright megjegyzéssel megegyező
engedélyekkel bírjon.
Engedélyezzük ennek az iratnak más nyelvre történt fordításának
másolását és terjesztését a fenti feltételek szerint, azzal a
különbséggel, hogy ezt az engedélyező megjegyzést - a Free Software
Foundation által elfogadott - fordításban is lehet közölni.
MAGYAR FORDÍTÁS
Gombai Sándor <sgombai@hotmail.com>