GAWK(1)

NAZWA
gawk - język wyszukiwania i przetwarzania wzorców

SKŁADNIA
gawk [ opcje w stylu POSIX lub GNU ] -f plik-programu [ -- ] plik ...
gawk [ opcje w stylu POSIX lub GNU ] [ -- ] tekst-programu plik ...

WAŻNA INFORMACJA
Niniejsza strona podręcznika została udostępniona z grzeczności. Jedynym Źródłem Prawdy programu gawk jest dokumentacja Texinfo, dostępna w wielu formatach w sieci pod adresem https://www.gnu.org/software/gawk/manual. Może być również zainstalowana w podsystemie Info na tym komputerze, dostępna wówczas za pośrednictwem polecenia info(1).

W przypadku różnic między dokumentacją Texinfo i niniejszą stroną podręcznika, dokumentacja Texinfo ma pierwszeństwo.

Proszę zauważyć, że dokumentacja Info oraz wersje HTML i PDF podręcznika mają tę samą zawartość, ponieważ zostały wygenerowane z tego samego pliku źródłowego Texinfo.

Co więcej, opiekun gawk zastrzega sobie w przyszłości prawo do usunięcia niniejszego podręcznika systemowego lub znacznego ograniczenia jego zawartości, aby zmniejszyć obciążenie wynikające z utrzymywania go.

OPIS
Gawk jest implementacją GNU języka programowania AWK. Odpowiada on definicji tego języka z POSIX 1003.1. Wersja ta jest z kolei oparta na opisie z The AWK Programming Language, napisanym przez Aho, Kernighana i Weinbergera. Gawk udostępnia dodatkowe funkcje z bieżącej wersji awk Briana Kernighana oraz wiele rozszerzeń charakterystycznych dla GNU.

Wiersz poleceń składa się z opcji dla gawk, tekstu programu (jeśli nie podano go poprzez opcję -f lub --include) i wartości, które mają być udostępnione w predefiniowanych zmiennych ARGC i ARGV.

WSTĘP
Niniejsza strona podręcznika jest bardzo zwięzła. Wszystkie szczegóły opisano w GAWK: Efektywne programowanie w AWK i należy się z nim zapoznać aby poznać pełny opis danej funkcji. Tam, gdzie to możliwe, zamieszczone są odnośniki do wersji online tego podręcznika.

FORMAT OPCJI
Opcje gawk mogą być zarówno tradycyjnymi POSIX-owymi jednoliterowymi opcjami, jak i długimi opcjami w stylu GNU. Opcje POSIX-owe zaczynają się pojedynczym „-”, a opcje GNU „--”. Opcje w stylu GNU są udostępniane zarówno dla właściwości specyficznych dla GNU, jak i dla właściwości POSIX-owych. Inne implementacje AWK prawdopodobnie jednak będą przyjmować tylko tradycyjne, jednoliterowe opcje.

Opcje specyficzne dla gawk są używane zwykle w długiej postaci. Argumenty przekazywane długim opcjom w stylu GNU są łączone z opcją przy użyciu znaku =, bez dodatkowych spacji lub przekazywane w następnym argumencie wiersza poleceń (tj. bez znaku równości i po spacji).

Oprócz tego, każda długa opcja ma odpowiadającą jej opcję krótką, dzięki czemu funkcjonalność danej opcji może być używana ze skryptów wykonywalnych #!.

OPCJE
Gawk akceptuje następujące opcje. Najpierw podane są opcje standardowe, następnie opcje do rozszerzeń gawk, ułożone alfabetycznie według krótkiej opcji.

-f program-file, --file plik-programu
    Odczytuje źródło programu AWK z pliku plik-programu, zamiast odczytywać go z pierwszego argumentu wiersza poleceń. Można użyć wielu opcji -f. Pliki odczytywane za pomocą -f są traktowane w ten sposób, jak gdyby zaczynały się wyrażeniem @namespace "awk".

-F fs, --field-separator fs
    Używa fs jako wejściowego separatora pola (wartość predefiniowanej zmiennej FS).

-v var=val, --assign var=val
    Przyznaje zmiennej var wartość val. Robi to przed uruchomieniem programu. Takie wartości zmiennych są dostępne dla reguły BEGIN programu AWK.

-b, --characters-as-bytes
    Traktuje wszelkie dane wejściowe jako znaki jednobajtowe. Niniejszą opcję przesłania opcja --posix.

-c, --traditional
    Pracuje w trybie zgodności. W trybie tym, gawk zachowuje się identycznie z awk Briana Kernighana; nie jest rozpoznawane żadne ze specyficznych dla GNU rozszerzeń.

-C, --copyright
    Wypisuje krótką wersję informacji o prawach autorskich GNU na standardowe wyjście i pomyślnie kończy działanie.

-d[plik], --dump-variables[=plik]
    Wypisuje do pliku posortowaną listę zmiennych globalnych, ich typów i końcowych wartości. Domyślnym plikiem jest awkvars.out w katalogu bieżącym.

-D[plik], --debug[=plik]
    Włącza debugowanie programów AWK. Domyślnie, debuger odczytuje polecenia interaktywnie z klawiatury (standardowego wejścia). Opcjonalny argument plik określa plik z listą poleceń do debugera, w celu wykonania ich nieinteraktywnie.

    W tym trybie wykonania, gawk ładuje kod źródłowy AWK i czeka na polecenia debugowania. Gawk może debugować jedynie źródła programu AWK przekazane opcjami -f i --include. Debuger udokumentowano w GAWK: Efektywne programowanie w AWK; zob. https://www.gnu.org/software/gawk/manual/html_node/Debugger.html#Debugger.

-e tekst-programu, --source tekst-programu
    Używa tekstu-programu jako kodu źródłowego AWK. Każdy argument podany za pomocą opcji -e jest traktowana tak, jak gdyby zaczynała się instrukcją @namespace "awk".

-E plik, --exec plik
    Podobnie jednak do -f, opcja ta jest przetwarzana na końcu. Powinna być używana w skryptach #!, szczególnie w przypadku aplikacji CGI, aby unikać przekazywania opcji lub kodu źródłowego (!) w wierszu poleceń z URL-a. Opcja ta wyłącza przypisania zmiennych wiersza poleceń.

-g, --gen-pot
    Przegląda i analizuje program AWK program, i tworzy na standardowym wyjściu plik formatu GNU .pot (Portable Object Template), zawierający wpisy dla wszystkich podlegających lokalizacji łańcuchów w programie. Sam program nie jest wykonywany.

-h, --help
    Wypisuje na standardowe wyjście krótkie podsumowanie dostępnych opcji. Zgodnie z GNU Coding Standards, te opcje powodują natychmiastowe, pomyślne zakończenie pracy.

-i plik-do-włączenia, --include plik-do-włączenia
    Ładuje bibliotekę źródłową awk. Wyszukiwanie biblioteki ma miejsce za pomocą zmiennej środowiskowej AWKPATH. Jeśli pierwotne wyszukiwanie zawiedzie, kolejne będzie wykonane po dołączeniu przyrostka .awk. Plik będzie załadowany jednokrotnie (tj. eliminowane są duplikaty), a kod nie tworzy źródła głównego programu. Pliki odczytywane za pomocą --include są traktowane tak, jak gdyby zaczynały się instrukcją @namespace "awk".

-I, --trace
    Wypisuje wewnętrzne nazwy kodów bajtowych w trakcie ich wykonywania, przy działającym programie. Ślad jest wypisywany na standardowe wyjście błędów. Każdy „kod operacji” („op code”) jest poprzedzany na wyjściu znakiem +.

-k, --csv
    Włącza specjalne przetwarzanie CSV. Zob. Wartości rozdzielone przecinkiem (CSV) poniżej, aby dowiedzieć się więcej.

-l biblioteka, --load biblioteka
    Ładuje rozszerzenie gawk z biblioteki współdzielonej. Wyszukiwanie biblioteki ma miejsce za pomocą zmiennej środowiskowej AWKLIBPATH. Jeśli pierwotne wyszukiwanie zawiedzie, kolejne będzie wykonane po dołączeniu domyślnego przyrostka (rozszerzenia) biblioteki współdzielonej dla danej platformy. Oczekuje się, że procedura inicjalizacji biblioteki będzie miała nazwę dl_load().

-L [wartość], --lint[=wartość]
    Zapewnia ostrzeżenia o konstrukcjach, które są wątpliwe lub nieprzenośne na inne implementacje AWK. Lista dopuszczalnych wartości jest dostępna pod adresem https://www.gnu.org/software/gawk/manual/html_node/Options.html#Options.

-M, --bignum
    Wymusza korzystanie z arytmetyki liczb o dowolnej precyzji. Opcja ta nie odniesie skutku, jeśli nie skompilowano gawk z obsługą bibliotek GMP i MPFR GNU (w takim przypadku gawk wypisze ostrzeżenie).

    UWAGA: Funkcja ta istnieje warunkowo. Główny opiekun gawk się nią już nie zajmuje, jednak robi to jeden z członków zespołu deweloperskiego. Jeśli sytuacja ulegnie zmianie na niekorzyść, funkcja zostanie usunięta z gawk.

-n, --non-decimal-data
    Rozpoznaje wartości ósemkowe i szesnastkowe w danych wejściowych. Opcji tej należy używać ze szczególną ostrożnością!

-N, --use-lc-numeric
    Zmusza gawk do korzystania ze znaku dziesiętnego z locale (ustawień językowych), przy przetwarzaniu danych wejściowych.

-o[plik], --pretty-print[=plik]
    Wypisuje wersję programu sformatowaną za pomocą pretty-print do pliku. Domyślnym plikiem jest awkprof.out w bieżącym katalogu. Opcja ta wymusza --no-optimize.

-O, --optimize
    Włącza domyślne optymalizacje gawka wobec wewnętrznej reprezentacji programu. Opcja domyślnie włączona.

-p[plik-prof], --profile[=plik-prof]
    Rozpoczyna sesję profilowania i wysyła dane profilowania do pliku-prof. Domyślnie jest to awkprof.out w bieżącym katalogu. Profil zawiera liczbę wykonań każdej instrukcji programu (na lewym marginesie) oraz liczbę wywołań funkcji dla każdej funkcji użytkownika. W tym trybie gawk działa wolniej. Opcja wymusza --no-optimize.

-P, --posix
    Włącza tryb zgodności i wyłącza wiele podstawowych rozszerzeń.

-r, --re-interval
    Włącza użycie wyrażeń przedziałowych (interval expressions) w dopasowaniu wyrażeń regularnych. Wyrażenia przedziałowe są domyślnie włączone, a opcja ta pozostaje ze względu na kompatybilność wsteczną.

-s, --no-optimize
    Wyłącza domyślne optymalizacje gawka wobec wewnętrznej reprezentacji programu.

-S, --sandbox
    Uruchamia gawk w trybie piaskownicy, wyłączając funkcję system(), przekierowanie wejścia za pomocą getline, przekierowania wyjścia za pomocą print i printf oraz ładowanie rozszerzeń dynamicznych. Wykonywanie poleceń (poprzez potoki) również jest wyłączone.

-t, --lint-old
    Daje ostrzeżenia o konstrukcjach, które nieprzenośne na pierwotną wersję UNIX awk.

-V, --version
    Wypisuje na standardowe wyjście informacje o danej kopii programu gawk. Jest to przydatne przy zgłaszaniu błędów. Zgodnie z GNU Coding Standards, te opcje powodują natychmiastowe, pomyślne zakończenie pracy.

--  Sygnalizuje koniec opcji. Dzięki temu następne argumenty programu AWK mogą rozpoczynać się myślnikiem „-”. [Na przykład rozpoczynające się myślnikiem nazwy plików].

W trybie zgodności wszelkie inne opcje są zaznaczane jako niepoprawne, lecz poza tym są ignorowane. W normalnym trybie działania, jeśli dostarczono tekst programu AWK, nieznane opcje są mu przekazywane w tablicy ARGV, aby mógł je sobie sam przetworzyć.

Ze względu na kompatybilność z POSIX, można skorzystać z opcji -W, po której należy podać nazwę długiej opcji.

WYWOŁANIE PROGRAMU AWK
Program AWK składa się z sekwencji opcjonalnych dyrektyw, instrukcji wzorzec-akcja oraz opcjonalnych definicji funkcji.

    @include "nazwa_pliku"
    @nsinclude "nazwa_pliku"
    @load "nazwa_pliku"
    @namespace "nazwa"
    wzorzec    { instrukcje akcji }
    function nazwa(lista parametrów) { instrukcje }

Gawk najpierw odczytuje źródło programu z podanych plików-programu, jeśli je podano, z argumentów do opcji --source lub z pierwszego nieopcyjnego argumentu wiersza poleceń. Opcje -f i --source można podawać wielokrotnie w wierszu polecenia. Gawk czyta tekst programu tak, jakby wszystkie pliki-programu zostały połączone ze sobą w całość.

Dodatkowo, do dołączania innych plików źródłowych do swojego programu, mogą służyć wiersze zaczynające się od @include. Jest to równoważne użyciu opcji --include.

Wiersze zaczynające się od @nsinclude są również plikami do włączenia, ale z dwiema różnicami. Po pierwsze przestrzeń nazw w plikach włączenia nie jest resetowana na domyślną przestrzeń awk, a po wtóre takie pliki można włączać wielokrotnie.

Do ładowania funkcji rozszerzających mogą służyć wiersze zaczynające się od @load. Jest to równoważne użyciu opcji --load.

Zmienna środowiskowa AWKPATH określa ścieżkę przeszukiwania, używaną do znajdowania plików źródłowych podanych w opcji -f i --include. Jeśli zmienna ta nie istnieje, domyślną ścieżką staje się ".:/usr/local/share/awk". (Faktyczny katalog może być różny, zależnie od tego jak skompilowano i zainstalowano awk.) Jeśli nazwa pliku, podana opcji -f zawiera znak „/”, nie jest dokonywane żadne przeszukiwanie ścieżki.

Zmienna środowiskowa AWKLIBPATH określa ścieżkę przeszukiwania, używaną do znajdowania plików źródłowych podanych w opcji --include. Jeśli zmienna ta nie istnieje, domyślną ścieżką staje się "/usr/local/lib/gawk". (Faktyczny katalog może być różny, zależnie od tego jak skompilowano i zainstalowano awk.)

Gawk wywołuje programy AWK w następującej kolejności. Najpierw dokonuje wszelkich inicjalizacji zmiennych, zadanych w opcjach -v. Następnie kompiluje program do postaci wewnętrznej. Potem wywołuje kod, zawarty w regułach BEGIN (jeśli istnieją), a następnie zaczyna odczytywać każdy z plików, podanych w tablicy ARGV (aż do ARGV[ARGC-1]). Jeśli nie podano takich nazw plików, gawk odczytuje standardowe wejście.

Jeśli nazwa pliku w wierszu poleceń ma postać var=val , to jest traktowana jako inicjalizacja zmiennej. Zmienna var uzyska wartość val. (Dzieje się to po uruchomieniu każdej reguły BEGIN.)

Jeśli wartość konkretnego elementu ARGV jest pusta (""), to gawk ją pomija.

Dla każdego pliku wejściowego, jeśli istnieje reguła BEGINFILE, gawk wykonuje powiązany kod przed zawartością pliku. Podobnie, gawk wykonuje kod powiązany z regułami ENDFILE po przetworzeniu pliku.

Dla każdego rekordu wejścia gawk dokonuje porównania, sprawdzając czy odpowiada on jakiemuś wzorcowi z programu AWK. Jeśli wzorzec będzie odpowiadał rekordowi, zostanie wykonana związana z nim akcja. Wzorce są sprawdzane w kolejności ich pojawienia się w programie.

Na koniec, gdy wyczerpane zostanie całe wejście, gawk wywołuje kod zawarty w regułach END.

  Katalogi w wierszu polecenia
Zgodnie z normą POSIX, pliki podane w wierszu polecenia awk muszą być plikami tekstowymi. Jeśli tak nie jest, zachowanie jest „niezdefiniowane”. Większość wersji programu akw traktuje katalog podany w wierszu polecenia jako błąd krytyczny.

W przypadku programu gawk, katalog podany w wierszu polecenia powoduje wypisanie ostrzeżenia, lecz poza tym jest po prostu pomijany. Jeśli poda się opcję --posix lub --traditional, to gawk potraktuje katalogi w wierszu polecenia jako błąd krytyczny.

ZMIENNE, REKORDY I POLA
Zmienne AWK są dynamiczne; zaczynają istnieć gdy są po raz pierwszy użyte. Ich wartości są zmiennoprzecinkowe, znakowe (ciągi znaków) lub jedne i drugie naraz, zależnie od sposobu użycia. Dodatkowo, gawk pozwala na zmienne typu wyrażenia regularnego. AWK posiada również tablice jednowymiarowe; symulowane mogą być również tablice wielowymiarowe. Jednak gawk zapewnia prawdziwe tablice tablic. Podczas działania programu ustawianych jest kilka predefiniowanych zmiennych; są one opisane niżej.

  Rekordy
Rekordy są zwykle rozdzielone znakami nowego wiersza. Można to zmienić przypisując wartości wbudowanej zmiennej RS. Więcej szczegółów na stronie https://www.gnu.org/software/gawk/manual/html_node/Records.html.

  Pola
Przy odczytywaniu każdego rekordu wejściowego, gawk dzieli rekord na pola za pomocą wartości zmiennej FS służącej jako separator pól. Dodatkowo, zmiennymi FIELDWIDTHS i FPAT można kontrolować dzielenie pól wejściowych. Więcej szczegółów opisano, począwszy od strony https://www.gnu.org/software/gawk/manual/html_node/Fields.html.

Do każdego pola w rekordzie wejściowym można odwołać się przez jego pozycję: $1, $2, itd. $0 jest całym rekordem, łącznie z początkowymi i końcowymi białymi znakami.

Zmienna NF jest ustawiana na całkowitą liczbę pól w rekordzie wejściowym.

Odniesienia do pól nieistniejących (np. pól znajdujących się za $NF) dają łańcuch zerowy. Jednak nadanie nieistniejącemu polu wartości (np. $(NF+2) = 5) zwiększa wartość licznika NF, a pola znajdujące się „pomiędzy”, inicjuje łańcuchem zerowym; przypisanie to powoduje również ponowne przetworzenie wartości zmiennej $0, w której pola zostaną rozdzielone wartością OFS. Odniesienia do pól numerowanych wartościami ujemnymi powoduje błąd krytyczny. Zmniejszenie licznika NF powoduje utratę wartości przez pola znajdujące się poza nową wartością licznika, a wartość zmiennej $0 zostanie przeliczona, z polami rozdzielonymi wartością OFS.

Przypisanie wartości istniejącemu polu powoduje ponowne utworzenie całego rekordu podczas odwołania się do $0. Podobnie, przypisanie wartości do $0 powoduje, że rekord jest ponownie dzielony, tworząc nowe wartości pól.

  Wartości rozdzielone przecinkiem (CSV)
Przy wywołaniu z opcją -k lub --csv, gawk nie korzysta ze zwykłego rozstrzygania o rekordach oraz dzieleniu pól opisanego powyżej. Zamiast tego, rekordy są rozdzielane niecytowanymi znakami nowego wiersza, a pola są rozdzielane przecinkiem. Pola zawierające przecinki lub znaki nowego wiersza należy ująć w cudzysłów („"”), a cudzysłowy wewnątrz pola – podwoić. Więcej szczegółów pod adresem https://www.gnu.org/software/gawk/manual/html_node/Comma-Separated-Fields.html.

  Wbudowane zmienne
Poniżej wypisano wbudowano zmienne programu gawk. Lista ta jest celowo zwięzła. Więcej szczegółów opisano na stronie https://www.gnu.org/software/gawk/manual/html_node/Built_002din-Variables.

ARGC
    Liczba argumentów wiersza poleceń.

ARGIND
    Indeks w tablicy ARGV bieżąco przetwarzanego pliku.

ARGV
    Tablica argumentów wiersza poleceń. Tablica ta jest indeksowana od 0 do ARGC - 1.

BINMODE
    Na systemach nie-POSIX-owych, określa użycie trybu „binarnego” do wszystkich operacji wejścia/wyjścia plików. Więcej szczegółów pod adresem https://www.gnu.org/software/gawk/manual/html_node/PC-Using.html.

CONVFMT
    Format konwersji dla liczb, domyślnie "%.6g".

ENVIRON
    Tablica zawierająca wartości bieżącego środowiska. Tablica ta jest indeksowana zmiennymi środowiskowymi, każdy element tablicy jest wartością danej zmiennej.

ERRNO
    Jeśli pojawi się błąd systemowy podczas przekierowywania dla getline, podczas odczytu dla getline lub podczas close(), to ERRNO jest ustawiana na łańcuch opisujący błąd. Podlega on tłumaczeniu przy ustawieniach locale innych niż angielskie.

FIELDWIDTHS
    Jest rozdzieloną białymi znakami listą szerokości pól. Jeśli zmienna ta jest ustawiona, to gawk rozbija wejście na pola o stałych szerokościach (domyślnie rozbija je według wartości separatora FS). Każdą szerokość pola można opcjonalnie poprzedzić wartościami rozdzielonymi dwukropkiem, określającymi liczbę znaków do pominięcia, przed rozpoczęciem pola.

FILENAME
    Nazwa pliku bieżącego pliku wejściowego. Jeśli nie podano plików w wierszu poleceń, FILENAME przechowuje wartość „-”. Wartość zmiennej FILENAME jest niezdefiniowana wewnątrz reguły BEGIN (chyba że zostanie nadana przez getline).

FNR Liczba rekordów wejściowych w bieżącym pliku wejściowym.

FPAT
    Wyrażenie regularne opisujące zawartość pól w rekordzie. Jeśli zmienna ta jest ustawiona, to gawk przetwarza wejście na pola pasujące do wyrażenia regularnego, zamiast używać wartości FS jako separatora pól.

FS  Separator pól wejściowych, domyślnie spacja. Więcej szczegółów pod adresem https://www.gnu.org/software/gawk/manual/html_node/Field-Separators.html.

FUNCTAB
    Tablica, której indeksy i powiązane wartości są nazwami wszystkich zdefiniowanych przez użytkownika lub będących rozszerzeniami funkcjami w programie. UWAGA: w tablicy FUNCTAB nie można używać instrukcji delete.

IGNORECASE
    Kontroluje wrażliwość na wielkość znaków wszystkich wyrażeń regularnych i operacji na łańcuchach tekstowych. Więcej szczegółów pod adresem https://www.gnu.org/software/gawk/manual/html_node/Case_002dsensitivity.html.

LINT
    Zapewnia dynamiczną kontrolę opcji --lint z wnętrza programu AWK.

NF  Liczba pól w bieżącym rekordzie wejściowym.

NR  Całkowita liczba odczytanych do tej pory rekordów wejściowych.

OFMT
    Format wyjściowy liczb, domyślnie "%.6g".

OFS Separator pól wyjściowych, domyślnie spacja.

ORS Separator rekordów wyjściowych, domyślnie nowa linia.

PREC
    Robocza precyzja liczb zmiennoprzecinkowych o dowolnej precyzji, domyślnie 53.

PROCINFO
    Elementy tej tablicy zapewniają dostęp do informacji o działającym programie AWK. Więcej szczegółów pod adresem https://www.gnu.org/software/gawk/manual/html_node/Auto_002dset.

ROUNDMODE
    Tryb zaokrąglania w przypadku arytmetyki liczb o dowolnej precyzji, domyślnie "N" (tryb roundTiesToEven IEEE-754). Więcej szczegółów pod adresem https://www.gnu.org/software/gawk/manual/html_node/Setting-the-rounding-mode.

RS  Separator rekordów wejściowych, domyślnie nowy wiersz.

RT  Zakończenie rekordu. Gawk ustawia RT na tekst wejściowy, który pasował do znaku lub wyrażenia regularnego określonego przez RS.

RSTART
    Indeks pierwszego znaku dopasowanego funkcją match(); 0 w przypadku braku dopasowania.

RLENGTH
    Długość łańcucha dopasowanego funkcją match(); -1 w przypadku braku dopasowania.

SUBSEP
    Łańcuch, używany do rozdzielania wielokrotnych indeksów w elementach tablicowych, domyślnie jest to "\034".

SYMTAB
    Tablica, której indeksy są nazwami wszystkich zdefiniowanych zmiennych globalnych i tablic w programie. W tablicy SYMTAB nie można używać instrukcji delete, ani przypisywać elementów z indeksami, które nie są nazwą zmiennych.

TEXTDOMAIN
    Dziedzina tekstowa programu AWK. Stosowane od odszukania zlokalizowanych tłumaczeń łańcuchów znakowych programu.

  Tablice
Tablice są indeksowane wyrażeniem, ujętym w nawiasy kwadratowe ([ i ]). Jeśli wyrażenie jest listą wyrażeń (wyraż, wyraż ...) to indeks tablicy jest sklejany z wartości (łańcuchowych) każdego wyrażenia, oddzielonych wartością zmiennej SUBSEP. [Uwaga: jest tak dlatego, że AWK używa tablic asocjacyjnych - tak jakby słownikowych - nie ma tu normalnych liczbowych indeksów - indeksem może być cokolwiek, najczęściej łańcuch. Symulowanie tablic wielowymiarowych polega właśnie na sklejaniu poszczególnych indeksów w unikalny łańcuch -- przyp. tłum.] Właściwość ta jest używana do symulacji wielowymiarowych tablic. Na przykład:

    i = "A"; j = "B"; k = "C"
    x[i, j, k] = "hello, world\n"

przypisuje łańcuch "hello, world\n" elementowi tablicy x, o indeksie będącym łańcuchem "A\034B\034C". Wszystkie tablice w AWK są asocjacyjne, tj. indeksowane wartościami łańcuchowymi.

Do sprawdzenia, czy dana tablica posiada indeks [łańcuchowy] o oczekiwanej wartości, można użyć specjalnego operatora in:

    if (val in array) 	print array[val]

Jeśli tablica posiada wielokrotne indeksy, można użyć konstrukcji (i, j) in array.

Konstrukcja in może być również użyta w pętli for do iterowania poprzez wszystkie elementy tablicy [ponieważ jest ona asocjacyjna, nie można jej iterować przez przelecenie indeksu od zera do najwyższej wartości - indeks może być tu przecież dowolnym łańcuchem - przyp. tłum.]. Jednak konstrukcja (i, j) in array działa tylko w testach, nie w pętlach for.

Element można skasować z tablicy przy użyciu polecenia delete. Poleceniem delete można się też posłużyć do skasowania całej zawartości tablicy, przez podanie jej nazwy bez indeksu.

gawk obsługuje prawdziwe tablice wielowymiarowe. Nie wymaga, aby były one „prostokątne”, jak w C lub C++. Więcej szczegółów pod adresem https://www.gnu.org/software/gawk/manual/html_node/Arrays.

  Przestrzenie nazw
Gawk obsługuje uproszczoną funkcjonalność przestrzeni nazw, aby pomóc obejść ograniczenia, wynikające z tego, że wszystkie zmienne w AWK są globalne.

Nazwa kwalifikowalna składa się z dwóch prostych identyfikatorów połączonych podwójnym dwukropkiem (::). Lewa strona identyfikatora reprezentuje przestrzeń nazw, a prawa — jej zmienną. Wszystkie proste (niekwalifikowalne) nazwy są uważane za znajdujące się w „bieżącej” przestrzeni nazw; domyślną przestrzenią nazw jest awk. Jednak proste identyfikatory składające się jedynie z wielkich liter są zawsze przypisywane przestrzeni nazw awk, nawet jeśli bieżąca przestrzeń nazw jest inna.

Można zmienić bieżącą przestrzeń nazw za pomocą dyrektywy @namespace "nazwa".

Standardowe, predefiniowane nazwy funkcji wbudowanych nie mogą być użyte jako nazwy przestrzeni nazw. Nazwy dodatkowych funkcji zapewnianych przez gawk mogą być używane jako przestrzenie nazw lub jako proste identyfikatory w innych przestrzeniach nazw. Więcej szczegółów opisano pod adresem https://www.gnu.org/software/gawk/manual/html_node/Namespaces.html#Namespaces.

  Typy zmiennych i konwersje
Zmienne oraz pola mogą być liczbami (zmiennoprzecinkowymi), łańcuchami lub jednym i drugim naraz. Mogą być też wyrażeniami regularnymi. Interpretacja wartości zmiennej zależy od kontekstu. Jeśli jest użyta w wyrażeniu numerycznym, jest interpretowana jako liczba; jeśli jest użyta w wyrażeniu łańcuchowym, to jest traktowana jak łańcuch.

Aby wymusić traktowanie zmiennej jako liczby, należy do niej dodać zero; aby wymusić traktowanie jej jako łańcucha, należy dokleić do niej łańcuch zerowy.

Niezainicjowane zmienne mają wartość numeryczną zero i łańcuchową "" (zero lub pusty łańcuch).

Podczas konwersji łańcucha na liczbę, obróbka jest dokonywana przy użyciu funkcji strtod(3). Liczba jest przekształcana na łańcuch przy użyciu wartości CONVFMT jako parametru formatującego dla sprintf(3), oraz wartości numerycznej jako argumentu. Jednak, nawet mimo że wszystkie liczby w AWK są zmiennoprzecinkowe, wartości całkowite są zawsze konwertowane jak całkowite (integer).

Gawk dokonuje porównań w następujący sposób: Jeśli dwie wartości są numeryczne, to są porównywane numerycznie. Jeśli jedna z wartości jest numeryczna, a druga łańcuchowa, która jest „łańcuchem numerycznym”, to porównania są również dokonywane numerycznie. W przeciwnym wypadku wartość numeryczna jest konwertowana do łańcucha i dokonywane jest porównanie łańcuchowe. Dwa łańcuchy są, oczywiście, porównywane jako łańcuchy.

Zauważ, że stałe znakowe, takie jak "57" nie są łańcuchami numerycznymi - są one stałymi łańcuchowymi. Pojęcie „łańcuchów numerycznych” odnosi się wyłącznie do pól, wejścia getinput, FILENAME, elementów ARGV, ENVIRON i elementów tablicy utworzonej funkcją split() lub patsplit(), będących łańcuchami numerycznymi. Podstawową koncepcją jest to, że wyglądające na numeryczne dane z wejścia użytkownika, i tylko one, są traktowane w opisany sposób.

  Stałe ósemkowe i szesnastkowe
W kodzie źródłowym programów AWK można korzystać ze stałych ósemkowych i szesnastkowych w stylu języka C. Na przykład, ósemkowa wartość 011 jest równa dziesiętnej 9, a szesnastkowa 0x11 jest równa dziesiętnej 17.

  Stałe łańcuchowe
Stałe łańcuchowe w AWK są sekwencjami znaków ujętymi w cudzysłowy (jak "wartość"). Wewnątrz łańcuchów rozpoznawane są pewne sekwencje specjalne, jak w C. Więcej szczegółów pod adresem https://www.gnu.org/software/gawk/manual/html_node/Escape-Sequences.

  Stałe wyrażeń regularnych
Stała wyrażenia regularnego jest sekwencją znaków ujętych pomiędzy ukośniki (jak /wartość/).

Sekwencji specjalnych opisanych w podręczniku można też używać wewnątrz stałych wyrażeń regularnych (np., /[ \t\f\n\r\v]/ dopasowuje białe znaki).

Gawk zapewnia stałe wyrażeń regularnych ze ścisłą kontrolą typów. Są one zapisywane z początkowym symbolem @ (jak: @/wartość/). Takie zmienne mogą być przypisane do wartości skalarnych (zmiennych, elementów tablicy) i przekazywane do funkcji zdefiniowanych przez użytkownika. Przypisane w ten sposób zmienne mają zwykły typ wyrażenia regularnego.

WZORCE I AKCJE
AWK jest językiem zorientowanym liniowo. Najpierw przychodzi wzorzec, a potem akcja. Instrukcje akcji są zawarte w nawiasach { i }. Pominąć można zarówno wzorzec, jak i akcję, lecz oczywiście nie obydwa te pola naraz. Jeśli pominięto wzorzec, to akcja jest wykonywana dla każdego z rekordów wejścia. Brakująca akcja jest z kolei równoważna akcji

    { print }

która wypisuje cały rekord.

Komentarze rozpoczynają się znakiem # i trwają aż do końca wiersza. Do oddzielania instrukcji można używać pustych wierszy. Zwykle instrukcja kończy się wraz z nowym wierszem, jednak nie jest to regułą w przypadku wierszy kończących się na przecinek, {, ?, :, && lub ||. Dla wierszy kończących się na do lub else również wystąpi automatyczna kontynuacja instrukcji w następnym wierszu. W innych przypadkach, wiersz może być kontynuowany przez zakończenie go znakiem „\”; w takim wypadku znak nowego wiersza jest ignorowany. Jednak „\” po znaku # nie jest traktowane w specjalny sposób.

Wiele instrukcji można też zgrupować w jednym wierszu, oddzielając je znakiem „;”. Tyczy się to zarówno instrukcji w części akcji z pary wzorzec-akcja (zwykły przypadek), jak i do samych instrukcji wzorzec-akcja.

  Wzorce
Wzorce w AWK mogą być jedną z następujących rzeczy:

    BEGIN
    END
    BEGINFILE
    ENDFILE
    /wyrażenie regularne/
    wyrażenie relacyjne
    wzorzec && wzorzec
    wzorzec || wzorzec
    wzorzec ? wzorzec : wzorzec
    (wzorzec)
    ! wzorzec
    wzorzec1, wzorzec2

BEGIN i END są dwoma specjalnymi rodzajami wzorców, które nie są porównywane z danymi wejściowymi. Części akcji wszelkich wzorców BEGIN są łączone, tak jakby wszystkie one zostały napisane w pojedynczej regule BEGIN. Są one wykonywane przed rozpoczęciem odczytywania danych wejściowych. Podobnie, wszelkie reguły END są również łączone i wykonywane po wyczerpaniu danych wejściowych. (lub po dojściu do instrukcji exit.) Wzorce BEGIN i END nie mogą być łączone z innymi wzorcami w wyrażeniach wzorcowych. Wzorcom BEGIN i END nie może brakować części definiującej akcję.

BEGINFILE i ENDFILE są dodatkowymi specjalnymi wzorcami, których akcje są wykonywane, odpowiednio, przed odczytaniem pierwszego rekordu każdego pliku wejściowego z wiersza polecenia i po odczytaniu ostatniego rekordu każdego pliku. Wewnątrz reguły BEGINFILE wartość ERRNO jest łańcuchem pustym, jeśli plik otwarł się pomyślnie. W przeciwnym przypadku występuje jakiś problem z plikiem i kod powinien skorzystać z nextfile, aby go pominąć. Jeśli tego nie uczyni, gawk zgłosi swój standardowy błąd krytyczny dla plików, których nie da się otworzyć.

Dla wzorców /wyrażeń regularnych/ powiązana instrukcja wykonywana jest dla każdego rekordu wejściowego, który odpowiada zadanemu wyrażeniu regularnemu. Wyrażenia regularne są w gruncie rzeczy tymi samymi wyrażeniami, które można spotkać w egrep(1). Więcej informacji o wyrażeniach regularnych znajduje się na stronie https://www.gnu.org/software/gawk/manual/html_node/Regexp.html.

wyrażenie relacyjne może używać dowolnego operatora ze zdefiniowanych w sekcji o akcjach operatorów. Ogólnie, testują one, czy określone pola odpowiadają określonym wyrażeniom regularnym.

Operatory &&, ||, i ! są logicznymi AND, OR i NOT, podobnie jak w języku C. Są one obliczane w sposób skrócony, podobnie jak w C, i służą głównie do łączenia bardziej podstawowych wyrażeń wzorcowych. Podobnie jak w większości języków, dla wymuszenia kolejności porównywania można użyć nawiasów.

Operator ?: działa podobnie jak ten sam operator w C. Jeśli pierwszy wzorzec jest prawdziwy, to do testowania używany jest następny wzorzec; w przeciwnym wypadku używany jest trzeci wzorzec. Obliczany jest tylko albo drugi albo trzeci wzorzec.

Forma wzorzec1, wzorzec2 wyrażenia jest nazywana wzorcem zakresu. Dopasowuje ona wszystkie rekordy wejście, poczynając od rekordu, który odpowiada wzorcowi1, aż do rekordu pasującego do wzorzec2, włącznie. Nie łączy się to z innymi rodzajami wyrażeń wzorcowych.

  Akcje
Instrukcje akcji są zawarte w nawiasach { i }. Instrukcje akcji składają się ze zwyczajnych instrukcji przypisania, warunków i instrukcji pętli, które można znaleźć w większości innych języków programowania. Operatory, instrukcje sterującymi, a także instrukcje wejścia/wyjścia są opracowane na podstawie tych, spotykanych w języku C.

  Operatory
Operatory w AWK, w kolejności malejącego priorytetu, to

(...)
    Grupowanie

$   Odniesienie się do pola.

++ --
    Inkrementuj i dekrementuj. Zarówno przedrostkowe i przyrostkowe.

^   Potęgowanie.

+ - !
    Jednoargumentowy plus, minus i logiczna negacja.

* / %
    Mnożenie, dzielenie i modulo (reszta dzielenia).

+ - Dodawanie i odejmowanie.

odstęp
    Konkatenacja (złączenie) łańcuchów.

|   |&
    Przekierowanie wejścia/wyjścia potokiem dla getline, print i printf.

< > <= >= == !=
    Regularne operatory relacyjne.

~ !~
    Dopasowanie wyrażenia regularnego, wyrażenie przeciwne.

in  Przynależność do tablicy.

&&  Koniunkcja logiczna AND.

||  Alternatywa logiczna OR.

?:  Wyrażenie warunkowe z C. Ma ono postać wyraż1 ? wyraż2 : wyraż3. Jeśli wyraż1 jest prawdziwe, to wartością wyrażenia jest wyraż2, w przeciwnym wypadku jest nią wyraż3. Obliczane jest wyłącznie jedno z wyraż2 i wyraż3.

= += -= *= /= %= ^=
    Przypisanie. Obsługiwane jest zarówno przypisanie absolutne (zmienna = wartość) jak i przypisanie operatorowe (inne formy).

  Instrukcje sterujące
Instrukcje sterujące są następujące:

    if (warunek) instrukcja [ else instrukcja ]
    while (warunek) instrukcja
    do instrukcja while (warunek)
    for (wyraż1; wyraż2; wyraż3) instrukcja
    for (var in tablica) instrukcja
    break
    continue
    delete tablica[indeks]
    delete tablica
    exit [ wyrażenie ]
    { instrukcje }
    switch (wyrażenie) { case wartość|wyraż-regul : instrukcja ... [ default: instrukcja ]
    }

  Instrukcje I/O
Instrukcje I/O są następujące:

close(plik [, jak])
    Zamyka otwarty plik, potok lub proces współbieżny (co-process). Opcjonalnego jak powinno się używać wyłącznie do zamykania jednego końca dwukierunkowego potoku do procesu współbieżnego. Musi to być wartość łańcuchowa, albo "to" albo "from".

getline
    Ustawia $0 z następnego rekordu wejściowego; ustawia NF, NR, FNR, RT.

getline <plik
    Ustawia $0 z następnego rekordu pliku; ustawia NF, RT.

getline var
    Ustawia var z następnego rekordu wejściowego; ustawia NR, FNR, RT.

getline var <plik
    Ustawia var z następnego rekordu pliku; ustawia RT.

polecenie | getline [var]
    Uruchamia przesyłanie potokiem wyjścia polecenia do $0 albo var, jak wyżej oraz RT.

polecenie |& getline [var]
    Uruchamia polecenia jako proces współbieżny, wysyłając potokiem jego wyjście do $0 albo do var, jak wyżej oraz RT (polecenie może być także gniazdem; zob. poniższy podrozdział Specjalne Nazwy Plików).

fflush([plik])
    Opróżnia bufory związane z otwartym plikiem wynikowym lub potokiem plik. Jeśli pominięto plik lub jest on łańcuchem pustym, to opróżniane są wszystkie wynikowe pliki i potoki.

next
    Kończy przetwarzanie bieżącego rekordu wejściowego. Następnie odczytywany jest kolejny rekord wejściowy i przetwarzanie rozpoczyna się od pierwszego wzorca programu AWK. Po osiągnięciu końca danych wejściowych, wykonywane są reguły END.

nextfile
    Kończy przetwarzanie bieżącego pliku wejściowego. Następny rekord wejściowy zostanie odczytany z kolejnego pliku wejściowego. Aktualizowane są wartości FILENAME i ARGIND, zaś FNR jest resetowane na 1 i przetwarzanie rozpoczyna się od pierwszego wzorca programu AWK. Po osiągnięciu końca danych wejściowych, wykonywane są reguły ENDFILE i END.

print
    Wypisuje bieżący rekord. Rekord wyjściowy zakończony jest wartością ORS.

print lista-wyrażeń
    Wypisuje wyrażenia. Każde wyrażenie jest oddzielone wartością OFS. Wyjściowy rekord jest kończony wartością ORS.

print lista-wyrażeń >plik
    Wypisuje wyrażenia do pliku. Każde wyrażenie jest rozdzielone wartością OFS. Rekord wyjściowy jest zakończony wartością ORS.

printf fmt, lista-wyrażeń
    Formatuje i wypisuje/

printf fmt, lista-wyrażeń >plik
    Formatuje i wypisuje do pliku.

system(cmd-line)
    Wywołuje polecenie systemowe cmd-line, i zwraca jego status wyjścia. (funkcja może nie być dostępna na systemach nie POSIX-owych). Pełne informacje o statusie zakończenia są dostępne pod adresem https://www.gnu.org/software/gawk/manual/html_node/I_002fO-Functions.html#I_002fO-Functions.

Dozwolone są też dodatkowe przekierowania wejścia i wyjścia dla print i printf.

print ... >> plik
    Dokleja wyjście do pliku.

print ... | polecenie
    Zapisuje do potoku.

print ... |& polecenie
    Wysyła dane do procesu współbieżnego lub gniazda (zob. też podrozdział Specjalne nazwy plików).

Funkcja getline zwraca 1 dla powodzenia, zero dla końca pliku oraz -1 jeśli wystąpił błąd. Jeśli wartość errno(3) wskazuje, że operacja wejścia/wyjścia może być ponowiona i ustawione jest PROCINFO["input", "RETRY"], to zamiast -1 zwracane jest -2 i można próbować wywoływać getline ponownie. W przypadku wystąpienia błędu, ERRNO ustawiane jest na łańcuch opisujący problem.

UWAGA: Niepowodzenie otwarcia dwukierunkowego gniazda powoduje zwrócenie niekrytycznego błędu do funkcji wywołującej. Używając potoku, procesu współbieżnego lub gniazda do getline albo z print lub printf wewnątrz pętli konieczne jest użycie close() do utworzenia nowych instancji tego polecenia lub gniazda. AWK nie zamyka automatycznie potoków, gniazd ani procesów współbieżnych gdy zwrócą one EOF (koniec pliku).

Wersje AWK instrukcji printf oraz funkcji sprintf() są podobne do tych z C. Więcej informacji pod adresem https://www.gnu.org/software/gawk/manual/html_node/Printf.html.

  Specjalne nazwy plików
Podczas przekierowań I/O przy użyciu print czy też printf do pliku, albo przy użyciu getline z pliku, gawk rozpoznaje wewnętrznie pewne specjalne nazwy plików. Te nazwy plików umożliwiają dostęp do otwartych deskryptorów plików, dziedziczonych po procesie rodzicielskim gawk'a (zazwyczaj powłoce). Inne pliki specjalne zapewniają dostęp do informacji o uruchomionym procesie gawk. Z tych specjalnych nazw plików można również korzystać w wierszu poleceń do określania plików danych. Te nazwy to:

-   Standardowe wejście.

/dev/stdin
    Standardowe wejście.

/dev/stdout
    Standardowe wyjście.

/dev/stderr
    Standardowe wyjście diagnostyczne.

/dev/fd/n
    Plik związany z otwartym deskryptorem pliku n.

Poniższych specjalnych nazw plików można używać z operatorem procesu współbieżnego |& do tworzenia witrualnych połączeń sieciowych TCP/IP:

/inet/tcp/lport/rhost/rport
/inet4/tcp/lport/rhost/rport
/inet6/tcp/lport/rhost/rport
    Pliki dla połączenia TCP/IP na lokalnym porcie lport do zdalnej stacji rhost na zdalnym porcie rport. Port 0 spowoduje, że to system znajdzie port. /inet4 wymusi połączenie IPv4, a /inet6 wymusi połączenie IPv6. Zwykłe /inet użyje domyślnej wartości systemowej (zapewne IPv4). Używalne tylko z dwukierunkowym operatorem wejścia/wyjścia |&.

/inet/udp/lport/rhost/rport
/inet4/udp/lport/rhost/rport
/inet6/udp/lport/rhost/rport
    Podobnie, lecz używa UDP/IP zamiast TCP/IP. Obsługa UDP jest przestarzała i w przyszłości będzie usunięta.

  Funkcje numeryczne
AWK ma następujące wbudowane funkcje arytmetyczne:

atan2(y, x)
    Zwraca arcus tangens y/x w radianach.

cos(wyraż)
    Zwraca cosinus z wyraż w radianach.

exp(wyraż)
    funkcja wykładnicza.

int(wyraż)
    Skraca do liczby całkowitej.

log(wyraż)
    funkcja logarytmu naturalnego.

rand()
    zwraca liczbę losową N, pomiędzy zerem a jedynką tak, że 0 ≤ N < 1.

sin(wyraż)
    Zwraca sinus z wyraż w radianach.

sqrt(wyraż)
    Zwraca pierwiastek kwadratowy wyraż.

srand([wyraż])
    Używa wyraż jako nowego ziarno dla generatora liczb losowych. Bez podanego wyraż, używa czasu dnia. Zwraca poprzednie ziarno generatora liczb losowych.

  Funkcje łańcuchowe
Gawk posiada następujące wbudowane funkcje łańcuchowe; szczegółowy opis pod adresem https://www.gnu.org/software/gawk/manual/html_node/String-Functions.

asort(s [, d [, jak] ])
    Zwraca liczbę elementów w źródłowej tablicy s. Sortuje zawartość s z zastosowaniem zwykłych reguł gawk do porównywania wartości, zastępując indeksy posortowanych wartości s, kolejnymi liczbami całkowitymi, począwszy od 1. Jeśli podano opcjonalną tablicę docelową d, to najpierw s jest powielana do d, a następnie sortowana jest d, zaś indeksy tablicy źródłowej s pozostają niezmienione. Opcjonalny łańcuch jak reguluje kierunek i tryb porównania. Prawidłowe wartości jak opisano pod adresem https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html#String-Functions. s i d mogą występować w tej samej tablicy; ma to sens tylko przy podaniu trzeciego argumentu.

asorti(s [, d [, jak] ])
    Zwraca liczbę elementów w źródłowej tablicy s. Zachowanie jest takie jak w przypadku asort() z tym wyjątkiem, że do sortowania służą indeksy tablicy, a nie jej wartości. Rezultatem jest tablica indeksowana numerycznie, której wartościami są pierwotne indeksy. Pierwotne wartości są tracone; z tego powodu należy zapewnić drugą tablicę, jeśli chce się zachować pierwotną. Zastosowanie opcjonalnego łańcucha jak jest takie samo jak w przypadku asort(). Również tutaj s i d mogą być w tej samej tablicy; to także ma sens tylko przy podaniu trzeciego argumentu.

gensub(r, s, h [, t])
    W łańcuchu docelowym t wyszukuje podłańcuchy odpowiadające wyrażeniu regularnemu r. Jeżeli h jest łańcuchem zaczynającym się od g lub G, to zastępuje wszystkie znalezione dopasowania r przez s. W przeciwnym wypadku, h jest liczbą wskazującą, które z kolejnych dopasowań r ma zostać zastąpione. Jeżeli nie podano t, to zamiast niego używane jest $0. Wewnątrz tekstu zastępującego s, można posłużyć się sekwencją \n, gdzie n jest cyfrą od 1 do 9, wskazującą na tekst dopasowany przez n-te podwyrażenie w nawiasach. Sekwencja \0 oznacza cały dopasowany tekst, tak samo jak znak &. W przeciwieństwie do sub() i gsub(), jako wynik funkcji zwracany jest zmieniony łańcuch, zaś pierwotny łańcuch docelowy pozostaje nie zmieniony.

gsub(r, s [, t])
    każdy podłańcuch, odpowiadający wyrażeniu regularnemu r w łańcuchu t, wymienia na łańcuch s, i zwraca liczbę podmian. Jeśli nie podano t, używa $0. Znak & w tekście zastępującym zostanie zastąpiony faktycznie dopasowanym tekstem. Aby otrzymać literalny znak & należy użyć \& (konieczne jest wpisanie tego jako "\\&"; zob. https://www.gnu.org/software/gawk/manual/html_node/Gory-Details.html#Gory-Details aby zapoznać się z pełniejszym omówieniem reguł znaków & oraz odwrotnych ukośników w tekście zastępującym dla funkcji sub(), gsub() i gensub()).

index(s, t)
    Zwraca indeks łańcucha t w łańcuchu s lub zero, gdy t jest nieobecne (co implikuje, że indeksy znaków zaczynają się od jedynki).

length([s])
    Zwraca długość łańcucha s lub długość $0, jeśli nie podano s. Przy argumencie będącym tablicą, length() zwraca liczbę elementów w tablicy.

match(s, r [, a])
    Zwraca pozycję w s, gdzie pojawia się wyrażenie regularne r. Jeśli nie podano r, zwracane jest zero. Jeśli jest jednak obecne, to dodatkowo ustawiane są zmienne RSTART i RLENGTH. Zauważ, że kolejność argumentów jest taka sama jak dla operatora ~: str ~ re. Pod adresem https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html#String-Functions dostępny jest opis, w jaki sposób następuje zapełnianie tablicy a, jeśli się ją poda.

patsplit(s, a [, r [, seps] ])
    Dzieli łańcuch s na tablicę a i tablicę separatorów seps w miejscach rozdzielonych wyrażeniem regularnym r, i zwraca liczbę pól. Wartościami elementów są fragmenty s, które zostały dopasowane przez r. Wartością seps[i] jest separator (być może null), który pojawił się po a[i]. Wartością seps[0] jest wiodący separator (być może null). Jeśli pominięto r, zamiast niego używane jest FPAT. Na początku, tablice a i seps są czyszczone. Podział odbywa się identycznie podział pól przy FPAT.

split(s, a [, r [, seps] ])
    Dzieli łańcuch s na tablicę a i tablicę separatorów seps, w miejscach rozdzielonych wyrażeniem regularnym r, i zwraca liczbę pól. Jeśli pominięto r, zamiast niego używane jest FS. Na początku, czyszczone są tablice a i seps. seps[i] jest separatorem pola dopasowanego przez r pomiędzy a[i] i a[i+1]. Podział odbywa się identycznie jak opisany powyżej podział rekordu na pola.

sprintf(fmt, lista-wyraż)
    wypisuje listę-wyraż według fmt, i zwraca łańcuch wyjściowy.

strtonum(str)
    Bada str, i zwraca jego numeryczną wartość. Jeśli str zaczyna się od początkowego 0, to traktuje go jako liczbę ósemkową. Jeśli str zaczyna się od początkowego 0x lub 0X, to traktuje go jako liczbę szesnastkową. W innym przypadku przyjmuje, że jest to liczba dziesiętna.

sub(r, s [, t])
    Podobne do gsub(), lecz podmienia tylko pierwszy odpowiadający podłańcuch. Zwraca zero albo jeden.

substr(s, i [, n])
    Zwraca maksymalnie n-znakowy podłańcuch łańcucha s, zaczynający się od pozycji i. Jeśli pominięto parametr n, użyta zostaje reszta s.

tolower(str)
    Zwraca kopię łańcucha str, w której wszystkie wielkie litery zostały zastąpione małymi. Nie alfabetyczne znaki pozostają bez zmian.

toupper(str)
    Zwraca kopię łańcucha str, w której wszystkie małe litery zostały zastąpione wielkimi. Nie alfabetyczne znaki pozostają bez zmian.

Gawk jest świadomy wielobajtowości. Oznacza to, że index(), length(), substr() i match() działają wobec znaków, nie bajtów.

  Funkcje czasu
Gawk zapewnia następujące funkcje do pozyskiwania znaczników czasowych i formatowania ich. Szczegółowy opis pod adresem https://www.gnu.org/software/gawk/manual/html_node/Time-Functions.

mktime(określenie-daty [, znacznik-utc])
    Przekształca określenie-daty na znacznik czasu w tej samej postaci, jaka jest zwracana przez systime() i zwraca wynik. Jeśli obecny jest znacznik-utc i jest on niezerowy i niebędący null, przyjmuje się, że czas jest w strefie czasu uniwersalnego (UTC), w innym przypadku przyjmuje się, że jest to czas lokalny. Jeśli określenie-daty nie zawiera wymaganych elementów lub zwrócony czas jest poza zakresem, mktime() zwraca -1. Szczegóły określenia-daty opisano pod adresem https://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html#Time-Functions.

strftime([format [, znacznik-czasu[, znacznik-utc]]])
    formatuje znacznik-czasu według wskazówek zawartych w zmiennej format. Jeśli obecny jest znacznik-utc i jest on niezerowy i niebędący null, przyjmuje się, że czas jest w strefie czasu uniwersalnego (UTC), w innym przypadku przyjmuje się, że jest to czas lokalny. Znacznik-czasu powinien być taki sam, jak ten, zwracany przez systime(). Jeśli brakuje parametru znacznik-czasu, używany jest bieżący czas dnia. Jeżeli pominięto format, to używany jest domyślny format równoważny formatowi wyników z date(1). Domyślny format jest dostępny w PROCINFO["strftime"]. Zobacz specyfikację funkcji strftime () w ISO C, aby zobaczyć jakie konwersje formatów są na pewno dostępne.

systime()
    Zwraca bieżący czas dnia w liczbach sekund od początku Epoki (czyli od północy UTC, 1 stycznia 1970 na systemach POSIX-owych).

  Funkcje operujące na bitach
Gawk zapewnia poniższe funkcje operujące na bitach. Działają przez konwersję wartości zmiennoprzecinkowych podwójnej precyzji na całkowite uintmax_t, wykonanie operacji, a następnie konwersję wyniku z powrotem na zmiennoprzecinkowy. Przekazanie ujemnych argumentów do którejś z tych funkcji spowoduje błąd krytyczny.

Funkcje:

and(v1, v2 [, ...])
    Zwraca bitową koniunkcję AND wartości podanych w liście argumentów. Musi być ich co najmniej dwa.

compl(val)
    Zwraca bitowe uzupełnienie val.

lshift(val, ile)
    Zwraca wartość val, przesuniętą w lewo o ile bitów.

or(v1, v2 [, ...])
    Zwraca bitową alternatywę OR wartości podanych w liście argumentów. Musi być ich co najmniej dwa.

rshift(val, ile)
    Zwraca wartość val, przesuniętą w prawo o ile bitów.

xor(v1, v2 [, ...])
    Zwraca bitową alternatywę wykluczającą XOR wartości podanych w liście argumentów. Musi być ich co najmniej dwa.

  Funkcje typu
Następujące funkcje zapewniają informacje związane z typem ich argumentów.

isarray(x)
    Zwraca prawdę, jeśli x jest tablicą lub fałsz w innym przypadku.

typeof(x)
    Zwraca łańcuch wskazujący typ x. Łańcuch przyjmie jedną z wartości: "array", "number", "regexp", "string", "strnum", "unassigned", or "untyped".

  Funkcje internacjonalizacji
Można używać wewnątrz programów AWK funkcji do tłumaczenia łańcuchów podczas wykonania programu. Szczegóły opisano pod adresem https://www.gnu.org/software/gawk/manual/html_node/I18N-Functions.html#I18N-Functions.

bindtextdomain(katalog [, domena])
    Określa katalog, w którym gawk szuka plików .gmo, w przypadku gdy nie będą lub nie mogą być umieszczone w „standardowych” miejscach. Zwraca katalog, z którym jest „związana” domena.

    Domyślną domeną jest wartość TEXTDOMAIN. Jeśli katalog jest łańcuchem pustym (""), to bindtextdomain() zwraca bieżące wiązanie dla zadanej domeny.

dcgettext(łańcuch [, domena [, kategoria]])
    Zwraca tłumaczenie łańcucha w domenie tekstowej domena dla kategorii locale kategoria. Domyślną domeną jest bieżąca wartość TEXTDOMAIN. Domyślną wartością kategorii jest "LC_MESSAGES".

dcngettext(łańcuch1, łańcuch2, liczba [, domena [, kategoria]])
    Zwraca formę mnogą używaną dla tłumaczenia liczby łańcucha1 i łańcucha2 w domenie tekstowej domena dla kategorii locale kategoria. Domyślną domeną jest bieżąca wartość TEXTDOMAIN. Domyślną wartością kategorii jest "LC_MESSAGES".

  Funkcje z wartościami logicznymi
Można tworzyć specjalne wartości typu logicznego; więcej informacji o działaniu i przyczynie ich istnienia opisano w podręczniku.

mkbool(wyrażenie)
    W zależności od wartości logicznej wyrażenia, zwraca wartość prawdy lub wartość fałszu. Wartość prawdy ma wartość numeryczną jeden. Wartość fałszu ma wartość numeryczną zero.

FUNKCJE UŻYTKOWNIKA
Funkcje w AWK są definiowane następująco:

    function nazwa(lista parametrów) { instrukcje }

Funkcje są wykonywane po wywołaniu ich z wyrażeń występujących we wzorcach lub akcjach. Do tworzenia instancji parametrów formalnych, zadeklarowanych w funkcji używane są parametry faktyczne użyte w wywołaniu funkcji. Tablice są przekazywane przez wskazanie, inne zmienne przez wartość.

Zmienne lokalne są deklarowane jako dodatkowe parametry w liście parametrów. Konwencja polega na separowaniu zmiennych lokalnych od parametrów dodatkowymi spacjami w liście parametrów. Na przykład:

    function  f(p, q,     a, b)	# a i b są lokalne { 	... }
    /abc/	{ ... ; f(1, 2) ; ... }

Lewy nawias w wywołaniu funkcji musi występować bezpośrednio za nazwą funkcji, bez wtrąconego odstępu. Ograniczenie to nie odnosi się do funkcji wbudowanych, które są opisane powyżej.

Funkcje mogą wołać siebie nawzajem i mogą być rekurencyjne. Parametry funkcji używane jako zmienne lokalne są podczas wywołania funkcji inicjalizowane na łańcuch pusty i liczbę zero. Chcąc, by funkcja zwracała wartość należy posłużyć się składnią: return wyraż. Wartość zwracana przez funkcję jest niezdefiniowana jeśli nie podano wartości zwracanej lub funkcja kończy pracę bez jawnej instrukcji powrotu.

Jeżeli użyto --lint, to gawk ostrzega o wywołaniach niezdefiniowanych funkcji podczas analizy składni, a nie w czasie wykonania. Wywołanie niezdefiniowanej funkcji w czasie wykonania powoduje błąd krytyczny.

Funkcje można wywoływać niebezpośrednio. W tym celu należy przypisać nazwę funkcji, która ma być wywołana, jako łańcuch, do zmiennej. Następnie zmienną można podać jakby była nazwą funkcji, poprzedzając ją znakiem @, jak w przykładzie:
    function mojafunkcja() { 	print "wywołano mojafunkcja" 	... }
    {	... 	ta_funkcja = "mojafunkcja" 	@ta_funkcja()	# wywołanie mojafunkcja poprzez ta_funkcja 	... }

Jeżeli użyto --lint, to gawk ostrzega o wywołaniach niezdefiniowanych funkcji podczas analizy składni, a nie w czasie wykonania. Wywołanie niezdefiniowanej funkcji w czasie wykonania powoduje błąd krytyczny.

DYNAMICZNE ŁADOWANIE NOWYCH FUNKCJI
Można dynamicznie dodawać nowe funkcje napisane w C lub C++ do pracującego interpretera gawk instrukcją @load. Dokładne szczegóły wykraczają poza zakres tej strony podręcznika; zob. https://www.gnu.org/software/gawk/manual/html_node/Dynamic-Extensions.html#Dynamic-Extensions.

SYGNAŁY
Profiler gawk przyjmuje dwa sygnały. SIGUSR1 powoduje, że zrzuca on profil i stos wywołań funkcji do pliku profilu, którym jest albo awkprof.out, albo plik podany z opcją --profile. Następnie kontynuuje działanie. SIGHUP powoduje, że gawk zrzuca profil i stos wywołań funkcji a następnie kończy pracę.

INTERNACJONALIZACJA
Stałe łańcuchowe są ciągami znaków ujętymi w cudzysłowy. W środowiskach innych niż angielskojęzyczne, możliwe jest oznakowanie łańcuchów w programie AWK jako wymagających tłumaczenia na własny język narodowy. Łańcuchy takie są oznaczone w programie AWK przez początkowy znak podkreślenia („_”). Na przykład,

    gawk 'BEGIN { print "hello, world" }'

zawsze wypisuje hello, world. Ale,

    gawk 'BEGIN { print _"hello, world" }'

może wypisać bonjour, monde we Francji. Więcej informacji na temat kroków potrzebnych do tworzenia i działania, dającego się tłumaczyć programu K, opisano pod adresem https://www.gnu.org/software/gawk/manual/html_node/Internationalization.html#Internationalization.

ROZSZERZENIA GNU
Gawk ma zbyt wiele rozszerzeń do POSIX awk. Są one opisane pod adresem https://www.gnu.org/software/gawk/manual/html_node/POSIX_002fGNU.html. Wszystkie rozszerzenia można wyłączyć, wywołując gawk z opcją --traditional lub --posix.

ZMIENNE ŚRODOWISKOWE
Do podania listy katalogów przeglądanych przez gawk podczas poszukiwania plików zadanych opcjami -f, --file, -i i --include oraz dyrektywami @include i @nsinclude, można posłużyć się zmienną środowiskową AWKPATH. Jeśli pierwotne wyszukiwanie nie powiedzie się, ścieżka jest przeszukiwana ponownie, z dołączonym do nazwy pliku .awk.

Do podania listy katalogów przeglądanych przez gawk podczas poszukiwania plików zadanych opcjami -l i --load można posłużyć się zmienną środowiskową AWKLIBPATH.

Zmienna środowiskowa GAWK_PERSIST_FILE, jeśli obecna, wskazuje na plik, który służy jako magazyn pamięci trwałej. Więcej szczegółów w GAWK: Efektywne programowanie w AWK.

Zmienna środowiskowa GAWK_READ_TIMEOUT może posłużyć do określenia czasu przeterminowania, w milisekundach, na oczekiwanie na wejście na terminalu, w potoku lub przez komunikację dwustronną, w tym gniazda.

W przypadku połączeń do stacji zdalnej za pomocą gniazda, GAWK_SOCK_RETRIES reguluje liczbę ponownych prób, a GAWK_MSEC_SLEEP interwał między nimi. Interwał określa się w milisekundach. W systemach nieobsługujących usleep(3), wartość jest zaokrąglana w górę, do pełnych sekund.

Jeśli w środowisku istnieje zmienna POSIXLY_CORRECT to gawk zachowuje się tak, jakby podano mu w wierszu poleceń opcję --posix. Jeśli podano opcję --lint, gawk wyda ostrzeżenie o tym efekcie.

STATUS ZAKOŃCZENIA
Jeśli instrukcja exit zostanie użyta z wartością, to gawk wychodzi z podaną w niej wartością numeryczną.

W pozostałych przypadkach, jeśli przy wykonaniu nie napotkano na problemy, gawk wychodzi z wartością stałej C EXIT_SUCCESS. Zwykle wynosi zero.

Jeśli wystąpi błąd, gawk wychodzi z wartością stałej C EXIT_FAILURE. Zwykle wynosi jeden.

Jeśli gawk wyjdzie z powodu błędu krytycznego, status zakończenia wynosi 2. W systemach innych niż POSIX, wartość tę można przypisać do EXIT_FAILURE.

INFORMACJA O WERSJI
Ta strona podręcznika man opisuje gawk, w wersji numer 5.4.

AUTORZY
Oryginalna wersja UNIX awk była opracowana i zaimplementowana przez Alfreda Aho, Petera Weinbergera i Briana Kernighana z Bell Laboratories. Aktualnym opiekunem jest Ozan Yigit. Brian Kernighan wciąż okazjonalnie rozwija program.

Paul Rubin i Jay Fenlason, z Free Software Foundation, napisali wersję gawk, zgodną z oryginalną wersją awk, rozprowadzaną w Seventh Edition UNIX. John Woods wprowadził wiele poprawek. David Trueman, z pomocą Arnolda Robbinsa, uczynił gawk zgodnym z nową wersją UNIX awk. Arnold Robbins jest bieżącym opiekunem projektu.

Pełna lista twórców gawk jest dostępna w dokumentacji programu oraz w podręczniku GAWK: Efektywne programowanie w AWK.

Plik README w dystrybucji gawk zawiera aktualne informacje o opiekunach oraz obecnie obsługiwanych portach.

ZGŁOSZENIA BŁĘDÓW I ZAPYTANIA
Po napotkaniu błędu w gawk, proszę skorzystać z programu gawkbug(1), aby go zgłosić.

Pełna instrukcja zgłaszania błędów jest dostępna pod adresem https://www.gnu.org/software/gawk/manual/html_node/Bugs.html. Prosimy o uważne przeczytanie i stosowanie się do niej. Czyni to zgłaszanie i poprawianie błędów znacznie łatwiejsze dla wszystkich zaangażowany. Naprawdę!

Z drugiej strony, jeśli ma się pytanie o to, jak wykonać dane zadanie używając awk lub gawk, można wysłać wiadomość na adres help-gawk@gnu.org z prośbą o pomoc.

USTERKI
Opcja -F niekoniecznie ma właściwość przypisywania zmiennych; pozostaje tylko dla zgodności wstecznej.

Niniejszy podręcznik systemowy jest zbyt obszerny, gawk ma zbyt wiele funkcji.

ZOBACZ TAKŻE
egrep(1), sed(1), gawkbug(1), printf(3), and strftime(3).

The AWK Programming Language, wydanie drugie, Alfred V. Aho, Brian W. Kernighan, Peter J. Weinberger, Addison-Wesley, 2023. ISBN 9-780138-269722.

GAWK: Efektywne programowanie w AWK, Wydanie 5.3, dostarczane ze źródłami gawk source. Bieżąca wersja tego dokumentu jest dostępna pod adresem https://www.gnu.org/software/gawk/manual.

Dokumentacja GNU gettext, dostępna pod adresem https://www.gnu.org/software/gettext.

PRZYKŁADY
Wypisz i posortuj nazwy zgłoszeniowe (login) wszystkich użytkowników:
	BEGIN	{ FS = ":" } 		{ print $1 | "sort" }
Zlicz wiersze w pliku:
		{ nlines++ } 	END	{ print nlines }
Poprzedź każdy wiersz jego numerem w pliku:
	{ print FNR, $0 }
Łącz i numeruj wiersze (wariacja tematu):
	{ print NR, $0 }
Uruchom zewnętrzne polecenie dla określonych wierszy danych:
	tail -f access_log | 	awk '/myhome.html/ { system("nmap " $1 ">> logdir/myhome.html") }'

KOPIOWANIE NINIEJSZEJ DOKUMENTACJI
Copyright © 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2007, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026 Free Software Foundation, Inc.

Permission is granted to make and distribute verbatim copies of this manual page provided the copyright notice and this permission notice are preserved on all copies.

Permission is granted to copy and distribute modified versions of this manual page under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.

Permission is granted to copy and distribute translations of this manual page into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Foundation.

TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika: Przemek Borys <pborys@dione.ids.pl> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 (https://www.gnu.org/licenses/gpl-3.0.html) lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.