Home Dokumentacje Efektywne programowanie w AWK - Podręcznik użytkownika GNU awk - Zmienne wbudowane
11 | 12 | 2019
Efektywne programowanie w AWK - Podręcznik użytkownika GNU awk - Zmienne wbudowane Drukuj

Przejdź do pierwszej, poprzedniej, następnej, ostatniej sekcji, spisu treści.

 


 

10. Zmienne wbudowane

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.

10.1. Zmienne wbudowane sterujące pracą 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
Ten łańcuch steruje konwersją liczb na łańcuchy (zob. 7.4. Konwersja łańcuchów i liczb). 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". CONVFMT zostało wprowadzone przez standard POSIX.
FIELDWIDTHS *
Jest to lista rozdzielonych spacjami kolumn, mówiąca 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ściowe
Jeś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 *
Jeżeli 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
Łańcuch ten steruje konwersją liczb na łańcuchy (zob. 7.4. Konwersja łańcuchów i liczb) przy wypisywaniu ich za pomocą instrukcji 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
Jest to separator pól wyjściowych (zob. 6.3. Separatory wyjścia), wypisywany pomiędzy polami wypisywanymi przez instrukcję print. Jego wartość domyślna to " ", łańcuch składający się z pojedynczej spacji.
ORS
Jest to separator rekordów wyjściowych, wypisywany na końcu każdej instrukcji print. Jego wartością domyślną jest "\n". (Zob. 6.3. Separatory wyjścia.)
RS
W 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).

10.2. Zmienne wbudowane niosące informacje

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
Argumenty wiersza poleceń dostępne dla programów 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 *
Indeks w 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
Tablica asocjacyjna (przyporządkowująca) zawierająca wartości środowiska. Indeksy tablicy są nazwami zmiennych środowiska, wartości są wartościami odpowiednich zmiennych środowiska. Na przykład, 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 *
Jeżeli podczas wykonywania przekierowania 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
To jest nazwa pliku aktualnie czytanego przez 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
To jest liczba rekordów wejściowych, które przetworzył 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.

10.3. Używanie 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ń 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.

 
Linki sponsorowane

W celu realizacji usług i funkcji na witrynach internetowych ZUI "ELPRO" stosujemy pliki cookies. Korzystanie z witryny bez zmiany ustawień dotyczących plików cookies oznacza, że będą one zapisywane w urządzeniu wyświetlającym stronę internetową. Więcej szczegółów w Polityce plików cookies.

Akceptuję pliki cookies z tej witryny.