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-listEbben 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.