Content
Data
License: GNU
Version number: GNU Awk 4.1.4, API: 1.1 (GNU MPFR 3.1.5, GNU MP 6.1.2)
Developer / owner: Free Software Foundation Inc.
Short description:
The manual page and help for the awk and gawk linux commands. gawk is the GNU Project's implementation of the AWK programming language. The language adapts POSIX 1003.2 for its definition in Command Language And Utilities Standard. On the other hand, this version is based on the description of The AWK Programming Language by Aho, Kernighan and Weinberger; supplemented by additional features found in V Release 4 of the UNIX awk system.
Man page output
man gawk
GAWK(1) Utility Commands GAWK(1)
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 kompatíbilis 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 Kódolási Szabályok -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:
· a \x escape szekvenciákat nem ismeri fel.
· 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.
· A function kulcsszó func szinonímáját nem ismeri fel.
· A ** és a **= operátor nem használható a ^ és a ^= helyén.
· Az fflush() függvény nem elérhető.
-W re-interval
--re-interval
Engedélyezi az intervallum kifejezések 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 Kódolási Szabályok -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 { tevékenység utasítások }
function név(paraméter lista) { utasítások }
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 mintájára. Minden olyan mintához rendelt tevékenység
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 mezők -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
/reguláris kifejezés/
relációs kifejezés
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 /reguláris kifejezés/ 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 relációs kifejezésekben 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 tartományminta. 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, beleértve 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-kifejezést
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 karakterosztály 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 belüli 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 (feltétel) utasítás [ else utasítás ]
while (feltétel) utasítás
do utasítás while (feltétel)
for (kif1; kif2; kif3) utasítás
for (var in array) utasítás
break
continue
delete array[index]
delete array
exit [ kifejezés ]
{ utasítások }
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 szélesség és pontosság 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 kifejezéslistát é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 szekvenciákat 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 név(paramáterlista) { utasítások }
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, mielőtt 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:
· A \x escape szekvencia. (A --posix kikapcsolja).
· Az fflush() függvény. (A --posix kikapcsolja).
· A systime(), strftime() és gensub() függvények.
· A bemeneti/kimeneti átirányításra használt különleges fájlneveket nem
ismeri fel.
· Az ARGIND, ERRNO és RT változóknak nincs speciális jelentésük.
· Az IGNORECASE változó és annak mellékhatásai nem érhetők el.
· A FIELDWIDTHS változó és a rögzített szélességű meződarabolás.
· Az RS változó reguláris kifejezésként való használata.
· Egyes karakterekre szétvágás az FS változó vagy a split() harmadik
argumentumának üres karakterláncra állításával.
· 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.
· Az aktuális file feldolgozásának megszüntetésére használt nextfile
utasítás.
· 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 ©) 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>
Free Software Foundation Dec 19 1996 GAWK(1)
Help output
gawk --help
Usage: gawk [POSIX or GNU style options] -f progfile [--] file ...
Usage: gawk [POSIX or GNU style options] [--] 'program' file ...
POSIX options: GNU long options: (standard)
-f progfile --file=progfile
-F fs --field-separator=fs
-v var=val --assign=var=val
Short options: GNU long options: (extensions)
-b --characters-as-bytes
-c --traditional
-C --copyright
-d[file] --dump-variables[=file]
-D[file] --debug[=file]
-e 'program-text' --source='program-text'
-E file --exec=file
-g --gen-pot
-h --help
-i includefile --include=includefile
-l library --load=library
-L[fatal|invalid] --lint[=fatal|invalid]
-M --bignum
-N --use-lc-numeric
-n --non-decimal-data
-o[file] --pretty-print[=file]
-O --optimize
-p[file] --profile[=file]
-P --posix
-r --re-interval
-S --sandbox
-t --lint-old
-V --version
To report bugs, see node `Bugs' in `gawk.info', which is
section `Reporting Problems and Bugs' in the printed version.
gawk is a pattern scanning and processing language.
By default it reads standard input and writes standard output.
Examples:
gawk '{ sum += $1 }; END { print sum }' file
gawk -F: '{ print $1 }' /etc/passwd
Related Content
- 420 views