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.
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
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 *
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
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-filesHa 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 *
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
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
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
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
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
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).
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
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 *
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
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 *
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
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
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
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
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
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
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 *
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.
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.