Większość zmiennych awk możemy wykorzystywać do własnych
celów. Nie są one nigdy zmieniane, poza sytuacjami, gdy nasz program
przypisuje im wartości, i nigdy na nic nie wpływają, poza sytuacjami
gdy bada je nasz program. Jednak kilka zmiennych w awk ma specjalne,
wbudowane znaczenie. Niektóre z nich awk sprawdza automatycznie,
więc umożliwiają nam wskazanie awk jak ma wykonywać pewne rzeczy.
Inne są automatycznie przypisywane przez awk, więc dostarczają
naszemu programowi informacje o wewnętrznych działaniach awk.
Niniejszy rozdział dokumentuje wszystkie zmienne wbudowane gawk.
Większość z nich jest także omówiona w rozdziałach opisujących ich zakresy
działania.
awk
Poniżej podano alfabetyczną listę zmiennych, które można zmieniać
sterując w ten sposób metodami wykonywania przez awk różnych
rzeczy. Zmienne specyficzne dla gawk oznaczono gwiazdką, `*'.
CONVFMT
sprintf
(zob. 12.3. Funkcje wbudowane działające na łańcuchach).
Jego domyślną wartością jest "%.6g".
CONVFMT zostało wprowadzone przez standard POSIX.
FIELDWIDTHS *
gawk jak
podzielić wejście o stałych, kolumnowych granicach pól. Jest to cecha
eksperymentalna. Przypisanie do FIELDWIDTHS przesłania użycie
do podziału na pola zmiennej FS.
Zob. 5.6. Czytanie danych o stałej szerokości, gdzie opisano ją szerzej.
Jeżeli gawk jest w trybie zgodności
(zob. 14.1. Opcje wiersza poleceń), to FIELDWIDTHS nie ma
znaczenia specjalnego, a operacje podziału na pola są wykonywane wyłącznie
w oparciu o wartość FS.
FS
FS jest separatorem pól wejściowych
(zob. 5.5. Jak rozdzielać pola).
Jego wartość jest jednoznakowym łańcuchem lub wieloznakowym wyrażeniem
regularnym dopasowującym oddzielenia między polami rekordu wejściowego.
Jeżeli wartością jest łańcuch pusty (""), to każdy znak rekordu
staje się osobnym polem.
Domyślną wartością jest " ", łańcuch składający się z pojedynczej
spacji. Jako specjalny wyjątek, wartość ta oznacza, że jednym separatorem
jest dowolny ciąg spacji, tabulacji i/lub znaków nowej linii. (9)
Powoduje ona również, że będą ignorowane wszelkie spacje, tabulacje i znaki
nowej linii na początku i końcu rekordu.
FS można nadać wartość w wierszu poleceń stosując opcję `-F':
awk -F, 'program' pliki-wejścioweJeśli
gawk do podziału na pola wykorzystuje FIELDWIDTHS,
przypisanie wartości do FS spowoduje, że powróci on do zwykłego,
opartego na FS, podziału na pola. Można to łatwo zrobić pisząc
po prostu `FS = FS', być może z komentarzem objaśniającym.
IGNORECASE *
IGNORECASE jest niezerowe lub niepuste, to wszystkie
porównania łańcuchów i dopasowania wyrażeń regularnych są niewrażliwe
na wielkość liter. Zatem, wszystkie wyrażenia regularne z `~'
i `!~', funkcje gensub, gsub, index, match,
split i sub, zakończenia rekordów za pomocą RS
oraz podział na pola przez FS ignorują wielkość liter przy
wykonywaniu odpowiednich działań na wyrażeniach regularnych.
Wartość IGNORECASE nie wpływa na indeksowanie tablic.
Zob. 4.5. Uwzględnianie wielkości liter w dopasowaniach.
Jeżeli gawk pracuje w trybie zgodności
(zob. 14.1. Opcje wiersza poleceń),
to IGNORECASE nie posiada żadnego szczególnego znaczenia,
a działania na łańcuchach i wyrażeniach regularnych zawsze rozróżniają małe
i duże litery.
OFMT
print.
W praktyce, działa dzięki temu, że jest przekazywany jako pierwszy argument
funkcji sprintf
(zob. 12.3. Funkcje wbudowane działające na łańcuchach).
Jego domyślną wartością jest "%.6g". Wcześniejsze wersje awk
wykorzystywały też OFMT do określenia uniwersalnego formatu konwersji
liczb na łańcuchy we wszelkich wyrażeniach. Obecnie jest to wykonywane
przez CONVFMT.
OFS
print.
Jego wartość domyślna to " ", łańcuch składający się
z pojedynczej spacji.
ORS
print. Jego wartością domyślną jest "\n".
(Zob. 6.3. Separatory wyjścia.)
RS
awk jest separatorem rekordów wejściowych. Jego wartością domyślną
jest łańcuch zawierający pojedynczy znak nowej linii, co znaczy, że rekordy
wejściowe składają się z pojedynczego wiersza tekstu. Może być też
łańcuchem pustym, wówczas rekordy rozdzielane są ciągami pustych wierszy,
albo wyrażeniem regularnym, wówczas rekordy rozdzielane są dopasowaniami
tego wyrażenia w tekście wejściowym.
(Zob. 5.1. Jak wejście dzielone jest na rekordy.)
SUBSEP
SUBSEP jest separatorem indeksów. Ma wartość domyślną "\034"
i jest wykorzystywany do podziału na części indeksów tablicy wielowymiarowej.
Zatem, wyrażenie foo["A", "B"] odwołuje się do
foo["A\034B"] (zob. 11.9. Tablice wielowymiarowe).
Niżej podano alfabetyczną listę zmiennych, którym w różnych okolicznościach
awk automatycznie nadaje wartość w celu dostarczenia informacji
programowi użytkownika.
Zmienne specyficzne dla gawk oznaczono gwiazdką, `*'.
ARGC
ARGV
awk przechowywane
są w tablicy o nazwie ARGV. ARGC jest liczbą argumentów
obecnych w wierszu poleceń.
Zob. 14.2. Inne argumenty wiersza poleceń.
Inaczej niż większość tablic awk, ARGV jest indeksowana
od zera do ARGC - 1. Na przykład:
$ awk 'BEGIN {
> for (i = 0; i < ARGC; i++)
> print ARGV[i]
> }' inventory-shipped BBS-list
-| awk
-| inventory-shipped
-| BBS-list
W tym przykładzie ARGV[0] zawiera "awk", ARGV[1]
zawiera "inventory-shipped", zaś ARGV[2] zawiera
"BBS-list". Wartość ARGC wynosi trzy, o jeden więcej niż
indeks ostatniego elementu w ARGV, gdyż elementy są numerowane
od zera.
Nazwy ARGC i ARGV, jak i konwencja indeksowania tablicy od
zera do ARGC - 1, pochodzą od metody dostępu do argumentów
wiersza poleceń występującej w języku C.
Zob. 10.3. Używanie ARGC i ARGV, gdzie opisano,
jak awk używa tych zmiennych.
ARGIND *
ARGV aktualnie przetwarzanego pliku. Za każdym razem, gdy
gawk otwiera do przetworzenia nowy plik danych, przypisuje
ARGIND indeks wskazujący na nazwę pliku w ARGV. Podczas
przetwarzania przez gawk plików wejściowych, zawsze prawdziwe
jest `FILENAME == ARGV[ARGIND]'.
Zmienna przydaje się przy przetwarzaniu plików wejściowych. Umożliwia
stwierdzenie, jak daleko na liście plików danych jesteśmy, i rozróżnienie
kolejnych wystąpień tej samej nazwy pliku w wierszu poleceń.
Mimo, iż wartość ARGIND wewnątrz programu można zmieniać, to
gawk automatycznie nada jej nową wartość przy otwieraniu
następnego pliku.
Zmienna ta jest rozszerzeniem gawk. W innych implementacjach
awk, lub gdy gawk działa w trybie zgodności
(zob. 14.1. Opcje wiersza poleceń), nie jest specjalna.
ENVIRON
ENVIRON["HOME"] może
zawierać `/home/arnold'. Zmiana tej tablicy nie wpływa na środowisko
przekazywane programom, które awk wywołuje za pośrednictwem
przekierowań czy funkcji system. (W przyszłych wersjach
gawk może to robić.)
Niektóre systemy operacyjne mogą nie mieć zmiennych środowiska.
Na takich systemach tablica ENVIRON jest pusta (za wyjątkiem
ENVIRON["AWKPATH"]).
ERRNO *
getline, odczytu
getline, czy działania close pojawi się błąd systemu,
to ERRNO będzie zawierać łańcuch opisujący ten błąd.
Zmienna ta jest rozszerzeniem gawk. W innych implementacjach
awk, lub jeśli gawk działa w trybie zgodności
(zob. 14.1. Opcje wiersza poleceń), nie jest specjalna.
FILENAME
awk. Jeżeli
w wierszu poleceń nie podano żadnych plików danych, awk czyta
ze standardowego wejścia, a FILENAME otrzymuje wartość "-".
Za każdym razem, gdy czytany jest nowy plik, zmienia się FILENAME
(zob. 5. Czytanie plików wejściowych).
Wewnątrz reguły BEGIN FILENAME ma wartość "", gdyż
nie ma jeszcze żadnych plików w trakcie przetwarzania.(10) (c.k.)
FNR
FNR jest numerem bieżącego rekordu w bieżącym pliku. Każdorazowo
gdy czytany jest nowy rekord FNR zwiększa się o jeden
(zob. 5.8. Odczyt bezpośredni przez getline).
Jest ponownie inicjowane zerem przy każdym rozpoczęciu nowego pliku.
NF
NF jest liczbą pól bieżącego rekordu wejściowego. Wartość NF
nadawana jest przy każdym odczycie nowego rekordu, tworzeniu nowego
pola lub zmianie $0 (zob. 5.2. Badanie pól).
NR
awk od momentu
rozpoczęcia wykonywania programu
(zob. 5.1. Jak wejście dzielone jest na rekordy).
NR zmieniane jest każdorazowo przy odczycie nowego rekordu.
RLENGTH
RLENGTH jest długością podłańcucha dopasowanego funkcją match
(zob. 12.3. Funkcje wbudowane działające na łańcuchach).
Wartość RLENGTH przypisywana jest przez wywołanie funkcji
match. Jest to długość dopasowanego łańcucha, lub -1 jeżeli
nie znaleziono dopasowania.
RSTART
RSTART jest początkowym indeksem, w znakach, podłańcucha dopasowanego
funkcją match
(zob. 12.3. Funkcje wbudowane działające na łańcuchach).
Wartość RLENGTH przypisywana jest przez wywołanie funkcji
match. Jest to pozycja łańcucha, od której rozpoczyna się dopasowany
podłańcuch, lub zero jeżeli nie znaleziono dopasowania.
RT *
RT ustalane jest za każdym razem, gdy czytany jest rekord.
Zawiera tekst wejściowy, który pasował do tekstu wyznaczonego przez
RS, separator rekordów.
Zmienna ta jest rozszerzeniem gawk. W innych implementacjach
awk lub jeśli gawk działa w trybie zgodności
(zob. 14.1. Opcje wiersza poleceń), nie jest specjalna.
Dygresja na temat NR i FNR.
awk zamiast nadawać im bezwzględne wartości liczby przeczytanych
rekordów, za każdym razem, gdy czyta rekord po prostu zwiększa wartości
obu tych zmiennych.
Oznacza to, że nasz program może zmienić te zmienne, a dla każdego nowego
rekordu będą zwiększane ich nowe wartości (c.k.). Na przykład:
$ echo '1
> 2
> 3
> 4' | awk 'NR == 2 { NR = 17 }
> { print NR }'
-| 1
-| 17
-| 18
-| 19
Zanim do języka awk dodano FNR
(zob. 17.1. Główne różnice między V7 a SVR3.1),
wiele programów awk wykorzystywało te własność do śledzenia liczby
rekordów w pliku przez zerowanie NR przy zmianie FILENAME.
ARGC i ARGV
W 10.2. Zmienne wbudowane niosące informacje,
widzieliśmy program opisujący informacje zawarte w ARGC i ARGV:
$ awk 'BEGIN {
> for (i = 0; i < ARGC; i++)
> print ARGV[i]
> }' inventory-shipped BBS-list
-| awk
-| inventory-shipped
-| BBS-list
W tym przykładzie ARGV[0] zawiera "awk", ARGV[1]
zawiera "inventory-shipped", zaś ARGV[2] zawiera
"BBS-list".
Zwróć uwagę, że program awk nie jest wpisany w ARGV.
Do ARGV nie są też wprowadzone specjalne opcje wiersza poleceń
i ich argumenty. Obejmuje to przypisania zmiennych wykonane za pomocą opcji
`-v' (zob. 14.1. Opcje wiersza poleceń). Zwykłe przypisania
zmiennych w wierszu poleceń są traktowane jak argumenty i pojawiają
się w tablicy ARGV.
$ 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
Programy mogą zmieniać ARGC i elementy ARGV.
Za każdym razem, gdy awk osiąga koniec pliku wejściowego, używa
następnego elementu ARGV jako nazwy następnego pliku wejściowego.
Składując w nim inny łańcuch nasz program zmienia listę wyznaczającą,
jakie pliki mają być czytane. Do określenia standardowego wejścia
używa się "-". Wpisując dodatkowe elementy i zwiększając
ARGC spowodujemy odczyt dodatkowych plików.
Zmniejszenie wartości ARGC usuwa pliki wejściowe z końca listy.
Zapisując w innym miejscu stare wartości ARGC, program może
traktować usunięte argumenty jako coś innego niż nazwy plików.
W celu usunięcia pliku ze środka listy należy zamiast jego nazwy
w ARGV umieścić łańcuch pusty (""). Cechą specjalną
awk jest ignorowanie nazw plików zastąpionych łańcuchem pustym.
Do usunięcia elementów z ARGV można też wykorzystać instrukcję
delete (zob. 11.6. Instrukcja delete).
Wszystkie powyższe działania zwykle wykonuje się w regule BEGIN,
przed rozpoczęciem przetwarzania wejścia.
Zob. 16.1.4. Podział dużego pliku na części, i zob.
16.1.5. Duplikowanie wyjścia do wielu plików, gdzie jest
przykład każdej z metod usuwania elementów z ARGV.
Poniższy fragment przetwarza ARGV w celu przeanalizowania,
a następnie usunięcia opcji wiersza poleceń.
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: nierozpoznana opcja -- %c",
ARGV[0], substr(ARGV[i], 1, ,1))
print e > "/dev/stderr"
} else
break
delete ARGV[i]
}
}
Aby faktycznie pobrać opcje do programu awk, musimy zakończyć
opcje awk za pomocą `--', a następnie podać własne opcje,
jak tu:
awk -f myprog -- -v -d file1 file2 ...
W gawk nie jest to konieczne: jeśli nie podano opcji `--posix',
gawk milcząco umieszcza wszystkie nierozpoznane opcje w ARGV,
by mógł się nimi zająć program awk.
W momencie zauważenia nieznanej opcji gawk przestaje szukać innych
opcji, które w przeciwnym przypadku mógłby rozpoznać. Powyższy program
napisany dla gawk mógłby wyglądać tak:
gawk -f myprog -d -v file1 file2 ...
Ponieważ `-d' nie jest poprawną opcją gawk, występujące po niej
`-v' jest przekazywane do programu awk.
Przejdź do pierwszej, poprzedniej, następnej, ostatniej sekcji, spisu treści.