Go to the first, previous, next, last section, table of contents.


Beépített változók

A legtöbb awk változó saját használatra mindig elérhetô; az értékük soha nem változik meg, kivétel ha a program értéket rendel hozzá, és soha nem befolyásol semmit, amikor az értékét lekérdézzük. Ugyanakkor néhány awk változónak speciális elôre definiált jelentése van. Ezek közül néhányat az awk automatikusan többször megvizsgál, így ezek segítségével az awk működését befolyásolni lehet. Másokat az awk automatikusan beállít, így információt továbbít az awk belsô struktúrájából a programod felé.

Ez a fejezet dokumentálja az gawk összes beépített változóját. A legtöbbjük dokumentálva van még a hatásukat leíró fejezetekben is.

Az awk-ot befolyásoló beépített változók

Az alábbiakban azoknak a változóknak az ábécé sorrendbe szedett listáját közöljük, amelyek segítségével az awk működése befolyásolható. Azok a változók, amelyek csak a gawk-ban találhatók meg egy csillaggal `*' vannak megjelölve.

CONVFMT
Ez a szöveg befolyásolja a számok konverzióját szöveggé (see section Szövegek és számok konverziója). A változó értéke a sprintf függvény elsô argumentuma lesz (see section Szövegmanipuláló beépített függvények). Az alapértéke "%.6g". A CONVFMT változót a POSIX szabvány vezette be.
FIELDWIDTHS *
Egy szóközökkel elválasztott lista, ami megmondja a gawk-nak, hogy a bemenetet hogyan kell feldarabolni fix szélességű oszlopokra. Ez csak egy kísérleti megoldás. Ha a FIELDWIDTHS-nek értéket adunk akkor az FS nem érvényes többé a mezôk darabolásánál. See section Meghatározott szélességű adatok beolvasása, további információért. Ha a gawk "compatibility" módban van (see section Command Line Options), akkor a FIELDWIDTHS változónak nincs speciális jelentése, és a mezôkre darabolás kizárólag az FS változó alapján történik.
FS
Az FS változó adja meg a bemeneti mezôelválasztót (see section Hogyan történik a mezôelválasztás). A változó értéke egy egy-karakteres szöveg vagy több karakterbôl álló reguláris kifejezés ami illeszkedik a mezôket elválasztó szövegre. Ha az értéke egy üres szöveg ("") akkor a rekordon belül minden karakter egy különálló mezô lesz. A változó alapértéke a " ", egy szóközbôl álló szöveg. Ennek a speciális jelentésa az, hogy szóközök, tab és/vagy új sor karakterek sorozata alkotja a mezôelválasztót.(9) Egy másik speciális tulajdonság, hogy ebben az esetben a kezdô és végsô szóközök, tab és új sor karaktereket nem veszi figyelembe. Az FS változó értékét a parancssorból is be lehet állítani a `-F' opcióval:
awk -F, 'program' input-files
Ha a gawk a FIELDWIDTHS változót használja a mezôk feldarabolására, akkor ha egy értéket rendelünk az FS változóhoz a gawk visszakapcsol az alap elválasztó módba. Ennek egy egyszerű módja az `FS = FS' kifejezés.
IGNORECASE *
Ha az IGNORECASE nem zérus vagy nem üres szöveg, akkor minden szöveg összehasonlításnál és reguláris kifejezés illesztésnél nem tesz különbséget a kis- és nagybetűk között. Így a reguláris kifejezések illesztése a `~' és a `!~' operátorokkal és a gensub a gsub, az index, a match, a split és a sub függvények, az RS rekordelválasztó és az FS mezôelválasztó nem tesz különbséget a kis- és a nagybetűk között. Az IGNORECASE változó értéke nem befolyásolja a tömbök elemeire való hivatkozásnál használt szövegeket. See section Kis- és nagybetűk az illesztésekben. Ha a gawk "compatibility" módban van (see section Command Line Options), akkor az IGNORECASE változónak nincs speciális jelentése és a szöveg és a regexp műveletekben megkülönbözteti a kis- és nagybetűket.
OFMT
Ez a változó befolyásolja a számok szöveggé konvertálását (see section Szövegek és számok konverziója) amit a print kifejezés használ. Lényegében mintha a sprintf függvénynek az elsô argumentumát adnánk meg (see section Szövegmanipuláló beépített függvények). Alapesetben az értéke: "%.6g". Az awk korábbi verzióiban minden általános kifejezés esetén amikor egy számot szöveggé kellett konvertálni az awk a OFMT változót használta; ma már a CONVFMT változót használja erre.
OFS
Ez a kimeneti mezôelválasztót határozza meg (see section Kimeneti elválasztó). Amikor egy print kifejezés mezôket nyomtat ki, akkor a változó értékét nyomtatja ki a mezôk közé. Az alapérték " ", egy egyetlen szóközbôl álló szöveg.
ORS
Ez a kimeneti rekordelválasztó. A print kifejezés által kinyomtatott rekordok között nyomtatja ki a változó értékét. Az alapértéke: "\n". (See section Kimeneti elválasztó.)
RS
Ez a változó az awk bemeneti rekordelválasztója. Az alapértéke egy olyan szöveg, ami csak egy új sor karaktert tartalmaz. Ez azt jelenti, hogy a bemeneti rekord egyetlen sorból áll. Az értéke lehet üres szöveg is, így a rekordokat vagy üres sorok vagy regexp kifejezések illeszkedései választják el egymástól. (See section Hogyan történik a feldarabolás rekordokra.)
SUBSEP
A SUBSEP változó értéke választja el egy több dimenziós tömb indexeit és az alapértéke "\034". Így ez a kifejezés foo["A", "B"] valójában foo["A\034B"] kifejezéssel egyezik meg (see section Többdimenziós tömbök).

Információt hordozó beépített változók

Az alábbiakban azoknak a változóknak az ábécé sorrendbe szedett listáját közöljük, amelyeket az awk automatikusan állít be, és így információt biztosít a programod számára. Azok a változók, amelyek csak a gawk-ban használhatók egy csillaggal `*' vannak megjelölve.

ARGC
ARGV
Az awk program számára elérhetô parancssori argumentumokat az ARGV tömb tárolja. Az ARGC változó a parancssori argumentumok számát tárolja. See section Other Command Line Arguments. Más awk tömböktôl eltérôen az ARGV elemeinek az indexe zérustól (ARGC - 1) -ig terjed. Például:
$ awk 'BEGIN {
>        for (i = 0; i < ARGC; i++) 
>            print ARGV[i] 
>      }' inventory-shipped BBS-list
-| awk
-| inventory-shipped
-| BBS-list
Ebben a példában, az ARGV[0] értéke "awk", az ARGV[1] értéke "inventory-shipped" és az ARGV[2] tartalma a "BBS-list" szöveg. Az ARGC értéke három, eggyel több mint az ARGV tömb utolsó elemének indexe, mivel a tömb elemeit zérustól számozza. Az ARGC és az ARGV nevek, a zérustól (ARGC - 1)-ig indexelés a C programozási nyelvbôl származnak See section Az ARGC és az ARGV változók használata, ami további információt ad arról, hogy az awk hogyan használja ezeket a változókat.
ARGIND *
A feldolgozás alatt álló jelenlegi file indexét adja meg az ARGV tömbben. Minden alkalommal, amikor a gawk megnyit egy file-t feldolgozásra, beállítja az ARGIND változót az ARGV tömb elemének indexére. Amikor a gawk egy bemeneti file-t dolgoz fel a `FILENAME == ARGV[ARGIND]' kifejezés mindig igaz. Ez a változó a file-ok feldolgozásában hasznos, mivel ez a változó mondja meg, hogy hol tartunk a file-ok feldolgozásában, és így meg lehet különböztetni a parancssorban megadott azonos file neveket. Bár az ARGIND változó beállítható az awk programból, a gawk ezt a változót automatikusan beállítja az új értékre amikor elkezd feldolgozni egy új file-t. Ez a változó egy gawk kiegészítés. Más awk implementációkban vagy ha a gawk "compatibility" módban van (see section Command Line Options), akkor a változónak nincs speciális jelentése.
ENVIRON
Ez egy asszociatív tömb, ami a környezet értékeit tartalmazza. A tömb elemei a környezeti változók neveit tartalmazzák; az értékük az adott környezeti változó értékének felel meg. Például a ENVIRON["HOME"] értéke a /home/arnold lehet. Ha a tömb elemeit megváltoztatjuk, az nem befolyásolja azt a környezetet, amit az awk átad egy általa átirányítással vagy a system függvénnyel indított programnak. (A gawk jövôbeli verzióiban ez lehet, hogy megváltozik.) Néhány operációs rendszernek nincs környezeti változója. Ezeken a rendszereken a ENVIRON változó üres (kivéve a ENVIRON["AWKPATH"] értékét).
ERRNO *
Ha a getline-nál alkalmazott átirányítás, vagy a getline olvasás során, vagy egy close művelet alatt rendszer hiba lép fel, akkor az ERRNO változó egy a hibát leíró szöveget fog tartalmazni. Ez a változó egy gawk kiegészítés. Más awk implementációkban vagy ha a gawk "compatibility" módban van (see section Command Line Options), akkor a változónak nincs speciális jelentése.
FILENAME
Ez a változó tartalmazza az awk által éppen feldolgozás alatt álló file nevét. Amikor a parancssorban nincs file név megadva, és az awk a szabványos bemenetrôl olvas be, a FILENAME értéke "-". A FILENAME értéke megváltozik minden alkalommal, amikor egy új file-t kezd el feldolgozni (see section Bemeneti file-ok olvasása). A BEGIN szabályon belül a FILENAME értéke "", mivel ebben a szabályban még nem dolgoz fel file-okat.(10) (s.s.)
FNR
Az aktuális file-ban az aktuális rekord számát tartalmazza az FNR változó. Minden alkalommal, amikor az awk beolvas egy új rekordot a változó értéke megnövelôdik (see section Explicit beolvasás getline-al). Ha egy új file-t kezd el feldolgozni, akkor a változó értékét zérusra állítja.
NF
Az NF változó az aktuális bemeneti rekordban található mezôk számát tartalmazza. Az NF változó értékét az awk mindig beállítja, amikor egy új rekordot olvas be, vagy egy új mezôt hozunk létre,, vagy a $0 megváltozik (see section Mezôk elérése).
NR
Az awk által a program futásának kezdetétôl eddig feldolgozott bemeneti rekordok számát tartalmazza (see section Hogyan történik a feldarabolás rekordokra). Minden rekord beolvasása során az awk beállítja az NR értékét.
RLENGTH
A match függvény által illesztett részszöveg hosszát tartalmazza az RLENGTH változó (see section Szövegmanipuláló beépített függvények). Az RLENGTH változót a match függvény hívása állítja be. Az értéke az illeszkedô szöveg hossza vagy -1, ha nem volt illeszkedés.
RSTART
A match függvény által illesztett részszöveg kezdeti pozícióját adja meg az RSTART változó (see section Szövegmanipuláló beépített függvények). Az RSTART változót a match függvény hívása állítja be. Az értéke az illeszkedô szöveg kezdeti pozíciója vagy zérus, ha nem volt illeszkedés.
RT *
Minden rekord beolvasása során az awk beállítja az RT változó értékét. A változó értéke a rekordelválasztóra, RS, illeszkedô bemeneti szöveget tartalmazza. Ez egy gawk kiegészítés. Más awk implementációkban vagy ha a gawk "compatibility" módban van (see section Command Line Options), a változónak nincs speciális jelentése.

Egy megjegyzés az NR és az FNR változókról. Az awk egyszerűen megnöveli ezeket a változókat, amikor egy új rekordot olvas be, ahelyett, hogy a beolvasott rekordok számának abszolút értékét tárolná a változókban. Ez azt jelenti, hogy ha a programod megváltoztatja valamelyik változó értékét, akkor ezt az új értéket fogja megnövelni, amikor egy új rekordot olvas be (s.s.). Például:

$ echo '1
> 2
> 3
> 4' | awk 'NR == 2 { NR = 17 }
> { print NR }'
-| 1
-| 17
-| 18
-| 19

Mielôtt az FNR változó bekerült az awk nyelvbe (see section Major Changes between V7 and SVR3.1), sok awk program használta ezt a lehetôséget arra, hogy számon tartsa az egy file-ból beolvasott rekordok számát; amikor a FILENAME változó értéke megváltozott az NR értékét zérusra állították.

Az ARGC és az ARGV változók használata

A section Információt hordozó beépített változók, alatt ezt a programot láthattad, ami bemutatja, hogyan használható az ARGC és az ARGV változókban tárolt információ:

$ awk 'BEGIN {
>        for (i = 0; i < ARGC; i++) 
>            print ARGV[i] 
>      }' inventory-shipped BBS-list
-| awk
-| inventory-shipped
-| BBS-list

Ebben a példában az ARGV[0] értéke "awk", az ARGV[1] értéke "inventory-shipped" és az ARGV[2] értéke "BBS-list".

Érdemes megfigyelni, hogy maga az awk program nem került bele az ARGV tömbbe. Más speciális parancssori opciók, az argumentumaikkal együtt, szintén nem kerülnek be a tömbbe. Ilyenek például az értékadó utasítások a `-v' opcióval (see section Command Line Options). Normális parancssori értékadó utasítások az argumentum részei és megjelennek az ARGV tömbben.

$ cat showargs.awk
-| BEGIN {
-|     printf "A=%d, B=%d\n", A, B
-|     for (i = 0; i < ARGC; i++)
-|         printf "\tARGV[%d] = %s\n", i, ARGV[i]
-| }
-| END   { printf "A=%d, B=%d\n", A, B }
$ awk -v A=1 -f showargs.awk B=2 /dev/null
-| A=1, B=0
-| 	ARGV[0] = awk
-| 	ARGV[1] = B=2
-| 	ARGV[2] = /dev/null
-| A=1, B=2

A programod megváltoztathatja az ARGC változó értékét és az ARGV tömb elemeit. Minden alkalommal, amikor az awk eléri egy file végét, a következô file nevét az ARGV tömb következô elemébôl veszi. Ha ezt az értéket a programod megváltoztatja, akkor a programod az általad megadott file-t fogja feldolgozni. A "-" szöveg használata esetén a szabványos bemenetrôl fog olvasni. Extra elemek tárolásával és az ARGC megnövelésével további file-ok feldolgozására lehet utasítani az awk-ot.

Ha az ARGC értékét csökkentjük, akkor bemeneti file-t távolíthatunk el a parancssori listából. Ha az ARGC régi értékét elmentjük egy másik változóba, akkor az eldobott argumentumokat a program felhasználhatja.

Ahhoz, hogy a lista közepérôl távolítsunk el egy file nevet, az ARGV adott elemét üres szöveggel ("") kell feltölteni a file neve helyett. Ez egy speciális lehetôség, mivel az awk nem veszi figyelembe az üres szöveggel megadott file neveket. Másik lehetôség a delete kifejezés használata, ami eltávolít egy elemet az ARGV tömbbôl (see section A delete kifejezés).

Tipikusan ezt a feldolgozást a BEGIN szabályon belül érdemes elvégezni mielôtt a bemeneti file-ok feldolgozása megkezdôdik. See section Splitting a Large File Into Pieces, és lásd még section Duplicating Output Into Multiple Files, ami mindkét módszert bemutatja az ARGV egy elemének eltávolítására.

Az alábbi programrészlet az ARGV tömböt dolgozza fel és eltávolítja a parancssori opciókat.

BEGIN {
    for (i = 1; i < ARGC; i++) {
        if (ARGV[i] == "-v")
            verbose = 1
        else if (ARGV[i] == "-d")
            debug = 1
        else if (ARGV[i] ~ /^-?/) {
            e = sprintf("%s: unrecognized option -- %c",
                    ARGV[0], substr(ARGV[i], 1, ,1))
            print e > "/dev/stderr"
        } else
            break
        delete ARGV[i]
    }
}

Ahhoz, hogy tényleg csak az opciókat vegye figyelembe, az awk opciókat egy `--' kifejezéssel kell lezárni és azután kell megadni az opcióidat, például így:

awk -f myprog -- -v -d file1 file2 ...

Erre nincs szükség a gawk esetén: Hacsak a `--posix' opció nem lett megadva, a gawk minden, fel nem ismert opciót az ARGV tömbben helyez el, hogy az awk program dolgozza fel ôket.

Amint a gawk nem ismer fel egy opciót, azonnal befejezi az opciók feldolgozását. A fenti példa így nézne ki gawk-ban:

gawk -f myprog -d -v file1 file2 ...

Mivel a `-d' nem egy érvényes gawk opció ezért a további `-v' opció átadódik az awk programnak.


Go to the first, previous, next, last section, table of contents.