GAWK(1) Narzedzia GAWK(1) NAZWA gawk - jezyk wyszukiwania i przetwarzania wzorcow SKLADNIA gawk [ opcje w stylu POSIX lub GNU ] -f plik-programu [ -- ] plik ... gawk [ opcje w stylu POSIX lub GNU ] [ -- ] tekst-programu plik ... WAZNA INFORMACJA Niniejsza strona podrecznika zostala udostepniona z grzecznosci. Jedynym Zrodlem Prawdy programu gawk jest dokumentacja Texinfo, dostepna w wielu formatach w sieci pod adresem https://www.gnu.org/software/gawk/manual. Moze byc rowniez zainstalowana w podsystemie Info na tym komputerze, dostepna wowczas za posrednictwem polecenia info(1). W przypadku roznic miedzy dokumentacja Texinfo i niniejsza strona podrecznika, dokumentacja Texinfo ma pierwszenstwo. Prosze zauwazyc, ze dokumentacja Info oraz wersje HTML i PDF podrecznika maja te sama zawartosc, poniewaz zostaly wygenerowane z tego samego pliku zrodlowego Texinfo. Co wiecej, opiekun gawk zastrzega sobie w przyszlosci prawo do usuniecia niniejszego podrecznika systemowego lub znacznego ograniczenia jego zawartosci, aby zmniejszyc obciazenie wynikajace z utrzymywania go. OPIS Gawk jest implementacja GNU jezyka programowania AWK. Odpowiada on definicji tego jezyka z POSIX 1003.1. Wersja ta jest z kolei oparta na opisie z The AWK Programming Language, napisanym przez Aho, Kernighana i Weinbergera. Gawk udostepnia dodatkowe funkcje z biezacej wersji awk Briana Kernighana oraz wiele rozszerzen charakterystycznych dla GNU. Wiersz polecen sklada sie z opcji dla gawk, tekstu programu (jesli nie podano go poprzez opcje -f lub --include) i wartosci, ktore maja byc udostepnione w predefiniowanych zmiennych ARGC i ARGV. WSTEP Niniejsza strona podrecznika jest bardzo zwiezla. Wszystkie szczegoly opisano w GAWK: Efektywne programowanie w AWK i nalezy sie z nim zapoznac aby poznac pelny opis danej funkcji. Tam, gdzie to mozliwe, zamieszczone sa odnosniki do wersji online tego podrecznika. FORMAT OPCJI Opcje gawk moga byc zarowno tradycyjnymi POSIX-owymi jednoliterowymi opcjami, jak i dlugimi opcjami w stylu GNU. Opcje POSIX-owe zaczynaja sie pojedynczym ,,-", a opcje GNU ,,--". Opcje w stylu GNU sa udostepniane zarowno dla wlasciwosci specyficznych dla GNU, jak i dla wlasciwosci POSIX-owych. Inne implementacje AWK prawdopodobnie jednak beda przyjmowac tylko tradycyjne, jednoliterowe opcje. Opcje specyficzne dla gawk sa uzywane zwykle w dlugiej postaci. Argumenty przekazywane dlugim opcjom w stylu GNU sa laczone z opcja przy uzyciu znaku =, bez dodatkowych spacji lub przekazywane w nastepnym argumencie wiersza polecen (tj. bez znaku rownosci i po spacji). Oprocz tego, kazda dluga opcja ma odpowiadajaca jej opcje krotka, dzieki czemu funkcjonalnosc danej opcji moze byc uzywana ze skryptow wykonywalnych #!. OPCJE Gawk akceptuje nastepujace opcje. Najpierw podane sa opcje standardowe, nastepnie opcje do rozszerzen gawk, ulozone alfabetycznie wedlug krotkiej opcji. -f program-file, --file plik-programu Odczytuje zrodlo programu AWK z pliku plik-programu, zamiast odczytywac go z pierwszego argumentu wiersza polecen. Mozna uzyc wielu opcji -f. Pliki odczytywane za pomoca -f sa traktowane w ten sposob, jak gdyby zaczynaly sie wyrazeniem @namespace "awk". -F fs, --field-separator fs Uzywa fs jako wejsciowego separatora pola (wartosc predefiniowanej zmiennej FS). -v var=val, --assign var=val Przyznaje zmiennej var wartosc val. Robi to przed uruchomieniem programu. Takie wartosci zmiennych sa dostepne dla reguly BEGIN programu AWK. -b, --characters-as-bytes Traktuje wszelkie dane wejsciowe jako znaki jednobajtowe. Niniejsza opcje przeslania opcja --posix. -c, --traditional Pracuje w trybie zgodnosci. W trybie tym, gawk zachowuje sie identycznie z awk Briana Kernighana; nie jest rozpoznawane zadne ze specyficznych dla GNU rozszerzen. -C, --copyright Wypisuje krotka wersje informacji o prawach autorskich GNU na standardowe wyjscie i pomyslnie konczy dzialanie. -d[plik], --dump-variables[=plik] Wypisuje do pliku posortowana liste zmiennych globalnych, ich typow i koncowych wartosci. Domyslnym plikiem jest awkvars.out w katalogu biezacym. -D[plik], --debug[=plik] Wlacza debugowanie programow AWK. Domyslnie, debuger odczytuje polecenia interaktywnie z klawiatury (standardowego wejscia). Opcjonalny argument plik okresla plik z lista polecen do debugera, w celu wykonania ich nieinteraktywnie. W tym trybie wykonania, gawk laduje kod zrodlowy AWK i czeka na polecenia debugowania. Gawk moze debugowac jedynie zrodla 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 Uzywa tekstu-programu jako kodu zrodlowego AWK. Kazdy argument podany za pomoca opcji -e jest traktowana tak, jak gdyby zaczynala sie instrukcja @namespace "awk". -E plik, --exec plik Podobnie jednak do -f, opcja ta jest przetwarzana na koncu. Powinna byc uzywana w skryptach #!, szczegolnie w przypadku aplikacji CGI, aby unikac przekazywania opcji lub kodu zrodlowego (!) w wierszu polecen z URL-a. Opcja ta wylacza przypisania zmiennych wiersza polecen. -g, --gen-pot Przeglada i analizuje program AWK program, i tworzy na standardowym wyjsciu plik formatu GNU .pot (Portable Object Template), zawierajacy wpisy dla wszystkich podlegajacych lokalizacji lancuchow w programie. Sam program nie jest wykonywany. -h, --help Wypisuje na standardowe wyjscie krotkie podsumowanie dostepnych opcji. Zgodnie z GNU Coding Standards, te opcje powoduja natychmiastowe, pomyslne zakonczenie pracy. -i plik-do-wlaczenia, --include plik-do-wlaczenia Laduje biblioteke zrodlowa awk. Wyszukiwanie biblioteki ma miejsce za pomoca zmiennej srodowiskowej AWKPATH. Jesli pierwotne wyszukiwanie zawiedzie, kolejne bedzie wykonane po dolaczeniu przyrostka .awk. Plik bedzie zaladowany jednokrotnie (tj. eliminowane sa duplikaty), a kod nie tworzy zrodla glownego programu. Pliki odczytywane za pomoca --include sa traktowane tak, jak gdyby zaczynaly sie instrukcja @namespace "awk". -I, --trace Wypisuje wewnetrzne nazwy kodow bajtowych w trakcie ich wykonywania, przy dzialajacym programie. Slad jest wypisywany na standardowe wyjscie bledow. Kazdy ,,kod operacji" (,,op code") jest poprzedzany na wyjsciu znakiem +. -k, --csv Wlacza specjalne przetwarzanie CSV. Zob. Wartosci rozdzielone przecinkiem (CSV) ponizej, aby dowiedziec sie wiecej. -l biblioteka, --load biblioteka Laduje rozszerzenie gawk z biblioteki wspoldzielonej. Wyszukiwanie biblioteki ma miejsce za pomoca zmiennej srodowiskowej AWKLIBPATH. Jesli pierwotne wyszukiwanie zawiedzie, kolejne bedzie wykonane po dolaczeniu domyslnego przyrostka (rozszerzenia) biblioteki wspoldzielonej dla danej platformy. Oczekuje sie, ze procedura inicjalizacji biblioteki bedzie miala nazwe dl_load(). -L [wartosc], --lint[=wartosc] Zapewnia ostrzezenia o konstrukcjach, ktore sa watpliwe lub nieprzenosne na inne implementacje AWK. Lista dopuszczalnych wartosci jest dostepna 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, jesli nie skompilowano gawk z obsluga bibliotek GMP i MPFR GNU (w takim przypadku gawk wypisze ostrzezenie). UWAGA: Funkcja ta istnieje warunkowo. Glowny opiekun gawk sie nia juz nie zajmuje, jednak robi to jeden z czlonkow zespolu deweloperskiego. Jesli sytuacja ulegnie zmianie na niekorzysc, funkcja zostanie usunieta z gawk. -n, --non-decimal-data Rozpoznaje wartosci osemkowe i szesnastkowe w danych wejsciowych. Opcji tej nalezy uzywac ze szczegolna ostroznoscia! -N, --use-lc-numeric Zmusza gawk do korzystania ze znaku dziesietnego z locale (ustawien jezykowych), przy przetwarzaniu danych wejsciowych. -o[plik], --pretty-print[=plik] Wypisuje wersje programu sformatowana za pomoca pretty-print do pliku. Domyslnym plikiem jest awkprof.out w biezacym katalogu. Opcja ta wymusza --no-optimize. -O, --optimize Wlacza domyslne optymalizacje gawka wobec wewnetrznej reprezentacji programu. Opcja domyslnie wlaczona. -p[plik-prof], --profile[=plik-prof] Rozpoczyna sesje profilowania i wysyla dane profilowania do pliku-prof. Domyslnie jest to awkprof.out w biezacym katalogu. Profil zawiera liczbe wykonan kazdej instrukcji programu (na lewym marginesie) oraz liczbe wywolan funkcji dla kazdej funkcji uzytkownika. W tym trybie gawk dziala wolniej. Opcja wymusza --no-optimize. -P, --posix Wlacza tryb zgodnosci i wylacza wiele podstawowych rozszerzen. -r, --re-interval Wlacza uzycie wyrazen przedzialowych (interval expressions) w dopasowaniu wyrazen regularnych. Wyrazenia przedzialowe sa domyslnie wlaczone, a opcja ta pozostaje ze wzgledu na kompatybilnosc wsteczna. -s, --no-optimize Wylacza domyslne optymalizacje gawka wobec wewnetrznej reprezentacji programu. -S, --sandbox Uruchamia gawk w trybie piaskownicy, wylaczajac funkcje system(), przekierowanie wejscia za pomoca getline, przekierowania wyjscia za pomoca print i printf oraz ladowanie rozszerzen dynamicznych. Wykonywanie polecen (poprzez potoki) rowniez jest wylaczone. -t, --lint-old Daje ostrzezenia o konstrukcjach, ktore nieprzenosne na pierwotna wersje UNIX awk. -V, --version Wypisuje na standardowe wyjscie informacje o danej kopii programu gawk. Jest to przydatne przy zglaszaniu bledow. Zgodnie z GNU Coding Standards, te opcje powoduja natychmiastowe, pomyslne zakonczenie pracy. -- Sygnalizuje koniec opcji. Dzieki temu nastepne argumenty programu AWK moga rozpoczynac sie myslnikiem ,,-". [Na przyklad rozpoczynajace sie myslnikiem nazwy plikow]. W trybie zgodnosci wszelkie inne opcje sa zaznaczane jako niepoprawne, lecz poza tym sa ignorowane. W normalnym trybie dzialania, jesli dostarczono tekst programu AWK, nieznane opcje sa mu przekazywane w tablicy ARGV, aby mogl je sobie sam przetworzyc. Ze wzgledu na kompatybilnosc z POSIX, mozna skorzystac z opcji -W, po ktorej nalezy podac nazwe dlugiej opcji. WYWOLANIE PROGRAMU AWK Program AWK sklada sie 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 parametrow) { instrukcje } Gawk najpierw odczytuje zrodlo programu z podanych plikow-programu, jesli je podano, z argumentow do opcji --source lub z pierwszego nieopcyjnego argumentu wiersza polecen. Opcje -f i --source mozna podawac wielokrotnie w wierszu polecenia. Gawk czyta tekst programu tak, jakby wszystkie pliki-programu zostaly polaczone ze soba w calosc. Dodatkowo, do dolaczania innych plikow zrodlowych do swojego programu, moga sluzyc wiersze zaczynajace sie od @include. Jest to rownowazne uzyciu opcji --include. Wiersze zaczynajace sie od @nsinclude sa rowniez plikami do wlaczenia, ale z dwiema roznicami. Po pierwsze przestrzen nazw w plikach wlaczenia nie jest resetowana na domyslna przestrzen awk, a po wtore takie pliki mozna wlaczac wielokrotnie. Do ladowania funkcji rozszerzajacych moga sluzyc wiersze zaczynajace sie od @load. Jest to rownowazne uzyciu opcji --load. Zmienna srodowiskowa AWKPATH okresla sciezke przeszukiwania, uzywana do znajdowania plikow zrodlowych podanych w opcji -f i --include. Jesli zmienna ta nie istnieje, domyslna sciezka staje sie ".:/usr/local/share/awk". (Faktyczny katalog moze byc rozny, zaleznie od tego jak skompilowano i zainstalowano awk.) Jesli nazwa pliku, podana opcji -f zawiera znak ,,/", nie jest dokonywane zadne przeszukiwanie sciezki. Zmienna srodowiskowa AWKLIBPATH okresla sciezke przeszukiwania, uzywana do znajdowania plikow zrodlowych podanych w opcji --include. Jesli zmienna ta nie istnieje, domyslna sciezka staje sie "/usr/local/lib/gawk". (Faktyczny katalog moze byc rozny, zaleznie od tego jak skompilowano i zainstalowano awk.) Gawk wywoluje programy AWK w nastepujacej kolejnosci. Najpierw dokonuje wszelkich inicjalizacji zmiennych, zadanych w opcjach -v. Nastepnie kompiluje program do postaci wewnetrznej. Potem wywoluje kod, zawarty w regulach BEGIN (jesli istnieja), a nastepnie zaczyna odczytywac kazdy z plikow, podanych w tablicy ARGV (az do ARGV[ARGC-1]). Jesli nie podano takich nazw plikow, gawk odczytuje standardowe wejscie. Jesli nazwa pliku w wierszu polecen ma postac var=val , to jest traktowana jako inicjalizacja zmiennej. Zmienna var uzyska wartosc val. (Dzieje sie to po uruchomieniu kazdej reguly BEGIN.) Jesli wartosc konkretnego elementu ARGV jest pusta (""), to gawk ja pomija. Dla kazdego pliku wejsciowego, jesli istnieje regula BEGINFILE, gawk wykonuje powiazany kod przed zawartoscia pliku. Podobnie, gawk wykonuje kod powiazany z regulami ENDFILE po przetworzeniu pliku. Dla kazdego rekordu wejscia gawk dokonuje porownania, sprawdzajac czy odpowiada on jakiemus wzorcowi z programu AWK. Jesli wzorzec bedzie odpowiadal rekordowi, zostanie wykonana zwiazana z nim akcja. Wzorce sa sprawdzane w kolejnosci ich pojawienia sie w programie. Na koniec, gdy wyczerpane zostanie cale wejscie, gawk wywoluje kod zawarty w regulach END. Katalogi w wierszu polecenia Zgodnie z norma POSIX, pliki podane w wierszu polecenia awk musza byc plikami tekstowymi. Jesli tak nie jest, zachowanie jest ,,niezdefiniowane". Wiekszosc wersji programu akw traktuje katalog podany w wierszu polecenia jako blad krytyczny. W przypadku programu gawk, katalog podany w wierszu polecenia powoduje wypisanie ostrzezenia, lecz poza tym jest po prostu pomijany. Jesli poda sie opcje --posix lub --traditional, to gawk potraktuje katalogi w wierszu polecenia jako blad krytyczny. ZMIENNE, REKORDY I POLA Zmienne AWK sa dynamiczne; zaczynaja istniec gdy sa po raz pierwszy uzyte. Ich wartosci sa zmiennoprzecinkowe, znakowe (ciagi znakow) lub jedne i drugie naraz, zaleznie od sposobu uzycia. Dodatkowo, gawk pozwala na zmienne typu wyrazenia regularnego. AWK posiada rowniez tablice jednowymiarowe; symulowane moga byc rowniez tablice wielowymiarowe. Jednak gawk zapewnia prawdziwe tablice tablic. Podczas dzialania programu ustawianych jest kilka predefiniowanych zmiennych; sa one opisane nizej. Rekordy Rekordy sa zwykle rozdzielone znakami nowego wiersza. Mozna to zmienic przypisujac wartosci wbudowanej zmiennej RS. Wiecej szczegolow na stronie https://www.gnu.org/software/gawk/manual/html_node/Records.html. Pola Przy odczytywaniu kazdego rekordu wejsciowego, gawk dzieli rekord na pola za pomoca wartosci zmiennej FS sluzacej jako separator pol. Dodatkowo, zmiennymi FIELDWIDTHS i FPAT mozna kontrolowac dzielenie pol wejsciowych. Wiecej szczegolow opisano, poczawszy od strony https://www.gnu.org/software/gawk/manual/html_node/Fields.html. Do kazdego pola w rekordzie wejsciowym mozna odwolac sie przez jego pozycje: $1, $2, itd. $0 jest calym rekordem, lacznie z poczatkowymi i koncowymi bialymi znakami. Zmienna NF jest ustawiana na calkowita liczbe pol w rekordzie wejsciowym. Odniesienia do pol nieistniejacych (np. pol znajdujacych sie za $NF) daja lancuch zerowy. Jednak nadanie nieistniejacemu polu wartosci (np. $(NF+2) = 5) zwieksza wartosc licznika NF, a pola znajdujace sie ,,pomiedzy", inicjuje lancuchem zerowym; przypisanie to powoduje rowniez ponowne przetworzenie wartosci zmiennej $0, w ktorej pola zostana rozdzielone wartoscia OFS. Odniesienia do pol numerowanych wartosciami ujemnymi powoduje blad krytyczny. Zmniejszenie licznika NF powoduje utrate wartosci przez pola znajdujace sie poza nowa wartoscia licznika, a wartosc zmiennej $0 zostanie przeliczona, z polami rozdzielonymi wartoscia OFS. Przypisanie wartosci istniejacemu polu powoduje ponowne utworzenie calego rekordu podczas odwolania sie do $0. Podobnie, przypisanie wartosci do $0 powoduje, ze rekord jest ponownie dzielony, tworzac nowe wartosci pol. Wartosci rozdzielone przecinkiem (CSV) Przy wywolaniu z opcja -k lub --csv, gawk nie korzysta ze zwyklego rozstrzygania o rekordach oraz dzieleniu pol opisanego powyzej. Zamiast tego, rekordy sa rozdzielane niecytowanymi znakami nowego wiersza, a pola sa rozdzielane przecinkiem. Pola zawierajace przecinki lub znaki nowego wiersza nalezy ujac w cudzyslow (,,""), a cudzyslowy wewnatrz pola - podwoic. Wiecej szczegolow pod adresem https://www.gnu.org/software/gawk/manual/html_node/Comma-Separated-Fields.html. Wbudowane zmienne Ponizej wypisano wbudowano zmienne programu gawk. Lista ta jest celowo zwiezla. Wiecej szczegolow opisano na stronie https://www.gnu.org/software/gawk/manual/html_node/Built_002din-Variables. ARGC Liczba argumentow wiersza polecen. ARGIND Indeks w tablicy ARGV biezaco przetwarzanego pliku. ARGV Tablica argumentow wiersza polecen. Tablica ta jest indeksowana od 0 do ARGC - 1. BINMODE Na systemach nie-POSIX-owych, okresla uzycie trybu ,,binarnego" do wszystkich operacji wejscia/wyjscia plikow. Wiecej szczegolow pod adresem https://www.gnu.org/software/gawk/manual/html_node/PC-Using.html. CONVFMT Format konwersji dla liczb, domyslnie "%.6g". ENVIRON Tablica zawierajaca wartosci biezacego srodowiska. Tablica ta jest indeksowana zmiennymi srodowiskowymi, kazdy element tablicy jest wartoscia danej zmiennej. ERRNO Jesli pojawi sie blad systemowy podczas przekierowywania dla getline, podczas odczytu dla getline lub podczas close(), to ERRNO jest ustawiana na lancuch opisujacy blad. Podlega on tlumaczeniu przy ustawieniach locale innych niz angielskie. FIELDWIDTHS Jest rozdzielona bialymi znakami lista szerokosci pol. Jesli zmienna ta jest ustawiona, to gawk rozbija wejscie na pola o stalych szerokosciach (domyslnie rozbija je wedlug wartosci separatora FS). Kazda szerokosc pola mozna opcjonalnie poprzedzic wartosciami rozdzielonymi dwukropkiem, okreslajacymi liczbe znakow do pominiecia, przed rozpoczeciem pola. FILENAME Nazwa pliku biezacego pliku wejsciowego. Jesli nie podano plikow w wierszu polecen, FILENAME przechowuje wartosc ,,-". Wartosc zmiennej FILENAME jest niezdefiniowana wewnatrz reguly BEGIN (chyba ze zostanie nadana przez getline). FNR Liczba rekordow wejsciowych w biezacym pliku wejsciowym. FPAT Wyrazenie regularne opisujace zawartosc pol w rekordzie. Jesli zmienna ta jest ustawiona, to gawk przetwarza wejscie na pola pasujace do wyrazenia regularnego, zamiast uzywac wartosci FS jako separatora pol. FS Separator pol wejsciowych, domyslnie spacja. Wiecej szczegolow pod adresem https://www.gnu.org/software/gawk/manual/html_node/Field-Separators.html. FUNCTAB Tablica, ktorej indeksy i powiazane wartosci sa nazwami wszystkich zdefiniowanych przez uzytkownika lub bedacych rozszerzeniami funkcjami w programie. UWAGA: w tablicy FUNCTAB nie mozna uzywac instrukcji delete. IGNORECASE Kontroluje wrazliwosc na wielkosc znakow wszystkich wyrazen regularnych i operacji na lancuchach tekstowych. Wiecej szczegolow pod adresem https://www.gnu.org/software/gawk/manual/html_node/Case_002dsensitivity.html. LINT Zapewnia dynamiczna kontrole opcji --lint z wnetrza programu AWK. NF Liczba pol w biezacym rekordzie wejsciowym. NR Calkowita liczba odczytanych do tej pory rekordow wejsciowych. OFMT Format wyjsciowy liczb, domyslnie "%.6g". OFS Separator pol wyjsciowych, domyslnie spacja. ORS Separator rekordow wyjsciowych, domyslnie nowa linia. PREC Robocza precyzja liczb zmiennoprzecinkowych o dowolnej precyzji, domyslnie 53. PROCINFO Elementy tej tablicy zapewniaja dostep do informacji o dzialajacym programie AWK. Wiecej szczegolow pod adresem https://www.gnu.org/software/gawk/manual/html_node/Auto_002dset. ROUNDMODE Tryb zaokraglania w przypadku arytmetyki liczb o dowolnej precyzji, domyslnie "N" (tryb roundTiesToEven IEEE-754). Wiecej szczegolow pod adresem https://www.gnu.org/software/gawk/manual/html_node/Setting-the-rounding-mode. RS Separator rekordow wejsciowych, domyslnie nowy wiersz. RT Zakonczenie rekordu. Gawk ustawia RT na tekst wejsciowy, ktory pasowal do znaku lub wyrazenia regularnego okreslonego przez RS. RSTART Indeks pierwszego znaku dopasowanego funkcja match(); 0 w przypadku braku dopasowania. RLENGTH Dlugosc lancucha dopasowanego funkcja match(); -1 w przypadku braku dopasowania. SUBSEP Lancuch, uzywany do rozdzielania wielokrotnych indeksow w elementach tablicowych, domyslnie jest to "\034". SYMTAB Tablica, ktorej indeksy sa nazwami wszystkich zdefiniowanych zmiennych globalnych i tablic w programie. W tablicy SYMTAB nie mozna uzywac instrukcji delete, ani przypisywac elementow z indeksami, ktore nie sa nazwa zmiennych. TEXTDOMAIN Dziedzina tekstowa programu AWK. Stosowane od odszukania zlokalizowanych tlumaczen lancuchow znakowych programu. Tablice Tablice sa indeksowane wyrazeniem, ujetym w nawiasy kwadratowe ([ i ]). Jesli wyrazenie jest lista wyrazen (wyraz, wyraz ...) to indeks tablicy jest sklejany z wartosci (lancuchowych) kazdego wyrazenia, oddzielonych wartoscia zmiennej SUBSEP. [Uwaga: jest tak dlatego, ze AWK uzywa tablic asocjacyjnych - tak jakby slownikowych - nie ma tu normalnych liczbowych indeksow - indeksem moze byc cokolwiek, najczesciej lancuch. Symulowanie tablic wielowymiarowych polega wlasnie na sklejaniu poszczegolnych indeksow w unikalny lancuch -- przyp. tlum.] Wlasciwosc ta jest uzywana do symulacji wielowymiarowych tablic. Na przyklad: i = "A"; j = "B"; k = "C" x[i, j, k] = "hello, world\n" przypisuje lancuch "hello, world\n" elementowi tablicy x, o indeksie bedacym lancuchem "A\034B\034C". Wszystkie tablice w AWK sa asocjacyjne, tj. indeksowane wartosciami lancuchowymi. Do sprawdzenia, czy dana tablica posiada indeks [lancuchowy] o oczekiwanej wartosci, mozna uzyc specjalnego operatora in: if (val in array) print array[val] Jesli tablica posiada wielokrotne indeksy, mozna uzyc konstrukcji (i, j) in array. Konstrukcja in moze byc rowniez uzyta w petli for do iterowania poprzez wszystkie elementy tablicy [poniewaz jest ona asocjacyjna, nie mozna jej iterowac przez przelecenie indeksu od zera do najwyzszej wartosci - indeks moze byc tu przeciez dowolnym lancuchem - przyp. tlum.]. Jednak konstrukcja (i, j) in array dziala tylko w testach, nie w petlach for. Element mozna skasowac z tablicy przy uzyciu polecenia delete. Poleceniem delete mozna sie tez posluzyc do skasowania calej zawartosci tablicy, przez podanie jej nazwy bez indeksu. gawk obsluguje prawdziwe tablice wielowymiarowe. Nie wymaga, aby byly one ,,prostokatne", jak w C lub C++. Wiecej szczegolow pod adresem https://www.gnu.org/software/gawk/manual/html_node/Arrays. Przestrzenie nazw Gawk obsluguje uproszczona funkcjonalnosc przestrzeni nazw, aby pomoc obejsc ograniczenia, wynikajace z tego, ze wszystkie zmienne w AWK sa globalne. Nazwa kwalifikowalna sklada sie z dwoch prostych identyfikatorow polaczonych podwojnym dwukropkiem (::). Lewa strona identyfikatora reprezentuje przestrzen nazw, a prawa -- jej zmienna. Wszystkie proste (niekwalifikowalne) nazwy sa uwazane za znajdujace sie w ,,biezacej" przestrzeni nazw; domyslna przestrzenia nazw jest awk. Jednak proste identyfikatory skladajace sie jedynie z wielkich liter sa zawsze przypisywane przestrzeni nazw awk, nawet jesli biezaca przestrzen nazw jest inna. Mozna zmienic biezaca przestrzen nazw za pomoca dyrektywy @namespace "nazwa". Standardowe, predefiniowane nazwy funkcji wbudowanych nie moga byc uzyte jako nazwy przestrzeni nazw. Nazwy dodatkowych funkcji zapewnianych przez gawk moga byc uzywane jako przestrzenie nazw lub jako proste identyfikatory w innych przestrzeniach nazw. Wiecej szczegolow opisano pod adresem https://www.gnu.org/software/gawk/manual/html_node/Namespaces.html#Namespaces. Typy zmiennych i konwersje Zmienne oraz pola moga byc liczbami (zmiennoprzecinkowymi), lancuchami lub jednym i drugim naraz. Moga byc tez wyrazeniami regularnymi. Interpretacja wartosci zmiennej zalezy od kontekstu. Jesli jest uzyta w wyrazeniu numerycznym, jest interpretowana jako liczba; jesli jest uzyta w wyrazeniu lancuchowym, to jest traktowana jak lancuch. Aby wymusic traktowanie zmiennej jako liczby, nalezy do niej dodac zero; aby wymusic traktowanie jej jako lancucha, nalezy dokleic do niej lancuch zerowy. Niezainicjowane zmienne maja wartosc numeryczna zero i lancuchowa "" (zero lub pusty lancuch). Podczas konwersji lancucha na liczbe, obrobka jest dokonywana przy uzyciu funkcji strtod(3). Liczba jest przeksztalcana na lancuch przy uzyciu wartosci CONVFMT jako parametru formatujacego dla sprintf(3), oraz wartosci numerycznej jako argumentu. Jednak, nawet mimo ze wszystkie liczby w AWK sa zmiennoprzecinkowe, wartosci calkowite sa zawsze konwertowane jak calkowite (integer). Gawk dokonuje porownan w nastepujacy sposob: Jesli dwie wartosci sa numeryczne, to sa porownywane numerycznie. Jesli jedna z wartosci jest numeryczna, a druga lancuchowa, ktora jest ,,lancuchem numerycznym", to porownania sa rowniez dokonywane numerycznie. W przeciwnym wypadku wartosc numeryczna jest konwertowana do lancucha i dokonywane jest porownanie lancuchowe. Dwa lancuchy sa, oczywiscie, porownywane jako lancuchy. Zauwaz, ze stale znakowe, takie jak "57" nie sa lancuchami numerycznymi - sa one stalymi lancuchowymi. Pojecie ,,lancuchow numerycznych" odnosi sie wylacznie do pol, wejscia getinput, FILENAME, elementow ARGV, ENVIRON i elementow tablicy utworzonej funkcja split() lub patsplit(), bedacych lancuchami numerycznymi. Podstawowa koncepcja jest to, ze wygladajace na numeryczne dane z wejscia uzytkownika, i tylko one, sa traktowane w opisany sposob. Stale osemkowe i szesnastkowe W kodzie zrodlowym programow AWK mozna korzystac ze stalych osemkowych i szesnastkowych w stylu jezyka C. Na przyklad, osemkowa wartosc 011 jest rowna dziesietnej 9, a szesnastkowa 0x11 jest rowna dziesietnej 17. Stale lancuchowe Stale lancuchowe w AWK sa sekwencjami znakow ujetymi w cudzyslowy (jak "wartosc"). Wewnatrz lancuchow rozpoznawane sa pewne sekwencje specjalne, jak w C. Wiecej szczegolow pod adresem https://www.gnu.org/software/gawk/manual/html_node/Escape-Sequences. Stale wyrazen regularnych Stala wyrazenia regularnego jest sekwencja znakow ujetych pomiedzy ukosniki (jak /wartosc/). Sekwencji specjalnych opisanych w podreczniku mozna tez uzywac wewnatrz stalych wyrazen regularnych (np., /[ \t\f\n\r\v]/ dopasowuje biale znaki). Gawk zapewnia stale wyrazen regularnych ze scisla kontrola typow. Sa one zapisywane z poczatkowym symbolem @ (jak: @/wartosc/). Takie zmienne moga byc przypisane do wartosci skalarnych (zmiennych, elementow tablicy) i przekazywane do funkcji zdefiniowanych przez uzytkownika. Przypisane w ten sposob zmienne maja zwykly typ wyrazenia regularnego. WZORCE I AKCJE AWK jest jezykiem zorientowanym liniowo. Najpierw przychodzi wzorzec, a potem akcja. Instrukcje akcji sa zawarte w nawiasach { i }. Pominac mozna zarowno wzorzec, jak i akcje, lecz oczywiscie nie obydwa te pola naraz. Jesli pominieto wzorzec, to akcja jest wykonywana dla kazdego z rekordow wejscia. Brakujaca akcja jest z kolei rownowazna akcji { print } ktora wypisuje caly rekord. Komentarze rozpoczynaja sie znakiem # i trwaja az do konca wiersza. Do oddzielania instrukcji mozna uzywac pustych wierszy. Zwykle instrukcja konczy sie wraz z nowym wierszem, jednak nie jest to regula w przypadku wierszy konczacych sie na przecinek, {, ?, :, && lub ||. Dla wierszy konczacych sie na do lub else rowniez wystapi automatyczna kontynuacja instrukcji w nastepnym wierszu. W innych przypadkach, wiersz moze byc kontynuowany przez zakonczenie go znakiem ,,\"; w takim wypadku znak nowego wiersza jest ignorowany. Jednak ,,\" po znaku # nie jest traktowane w specjalny sposob. Wiele instrukcji mozna tez zgrupowac w jednym wierszu, oddzielajac je znakiem ,,;". Tyczy sie to zarowno instrukcji w czesci akcji z pary wzorzec-akcja (zwykly przypadek), jak i do samych instrukcji wzorzec-akcja. Wzorce Wzorce w AWK moga byc jedna z nastepujacych rzeczy: BEGIN END BEGINFILE ENDFILE /wyrazenie regularne/ wyrazenie relacyjne wzorzec && wzorzec wzorzec || wzorzec wzorzec ? wzorzec : wzorzec (wzorzec) ! wzorzec wzorzec1, wzorzec2 BEGIN i END sa dwoma specjalnymi rodzajami wzorcow, ktore nie sa porownywane z danymi wejsciowymi. Czesci akcji wszelkich wzorcow BEGIN sa laczone, tak jakby wszystkie one zostaly napisane w pojedynczej regule BEGIN. Sa one wykonywane przed rozpoczeciem odczytywania danych wejsciowych. Podobnie, wszelkie reguly END sa rowniez laczone i wykonywane po wyczerpaniu danych wejsciowych. (lub po dojsciu do instrukcji exit.) Wzorce BEGIN i END nie moga byc laczone z innymi wzorcami w wyrazeniach wzorcowych. Wzorcom BEGIN i END nie moze brakowac czesci definiujacej akcje. BEGINFILE i ENDFILE sa dodatkowymi specjalnymi wzorcami, ktorych akcje sa wykonywane, odpowiednio, przed odczytaniem pierwszego rekordu kazdego pliku wejsciowego z wiersza polecenia i po odczytaniu ostatniego rekordu kazdego pliku. Wewnatrz reguly BEGINFILE wartosc ERRNO jest lancuchem pustym, jesli plik otwarl sie pomyslnie. W przeciwnym przypadku wystepuje jakis problem z plikiem i kod powinien skorzystac z nextfile, aby go pominac. Jesli tego nie uczyni, gawk zglosi swoj standardowy blad krytyczny dla plikow, ktorych nie da sie otworzyc. Dla wzorcow /wyrazen regularnych/ powiazana instrukcja wykonywana jest dla kazdego rekordu wejsciowego, ktory odpowiada zadanemu wyrazeniu regularnemu. Wyrazenia regularne sa w gruncie rzeczy tymi samymi wyrazeniami, ktore mozna spotkac w egrep(1). Wiecej informacji o wyrazeniach regularnych znajduje sie na stronie https://www.gnu.org/software/gawk/manual/html_node/Regexp.html. wyrazenie relacyjne moze uzywac dowolnego operatora ze zdefiniowanych w sekcji o akcjach operatorow. Ogolnie, testuja one, czy okreslone pola odpowiadaja okreslonym wyrazeniom regularnym. Operatory &&, ||, i ! sa logicznymi AND, OR i NOT, podobnie jak w jezyku C. Sa one obliczane w sposob skrocony, podobnie jak w C, i sluza glownie do laczenia bardziej podstawowych wyrazen wzorcowych. Podobnie jak w wiekszosci jezykow, dla wymuszenia kolejnosci porownywania mozna uzyc nawiasow. Operator ?: dziala podobnie jak ten sam operator w C. Jesli pierwszy wzorzec jest prawdziwy, to do testowania uzywany jest nastepny wzorzec; w przeciwnym wypadku uzywany jest trzeci wzorzec. Obliczany jest tylko albo drugi albo trzeci wzorzec. Forma wzorzec1, wzorzec2 wyrazenia jest nazywana wzorcem zakresu. Dopasowuje ona wszystkie rekordy wejscie, poczynajac od rekordu, ktory odpowiada wzorcowi1, az do rekordu pasujacego do wzorzec2, wlacznie. Nie laczy sie to z innymi rodzajami wyrazen wzorcowych. Akcje Instrukcje akcji sa zawarte w nawiasach { i }. Instrukcje akcji skladaja sie ze zwyczajnych instrukcji przypisania, warunkow i instrukcji petli, ktore mozna znalezc w wiekszosci innych jezykow programowania. Operatory, instrukcje sterujacymi, a takze instrukcje wejscia/wyjscia sa opracowane na podstawie tych, spotykanych w jezyku C. Operatory Operatory w AWK, w kolejnosci malejacego priorytetu, to (...) Grupowanie $ Odniesienie sie do pola. ++ -- Inkrementuj i dekrementuj. Zarowno przedrostkowe i przyrostkowe. ^ Potegowanie. + - ! Jednoargumentowy plus, minus i logiczna negacja. * / % Mnozenie, dzielenie i modulo (reszta dzielenia). + - Dodawanie i odejmowanie. odstep Konkatenacja (zlaczenie) lancuchow. | |& Przekierowanie wejscia/wyjscia potokiem dla getline, print i printf. < > <= >= == != Regularne operatory relacyjne. ~ !~ Dopasowanie wyrazenia regularnego, wyrazenie przeciwne. in Przynaleznosc do tablicy. && Koniunkcja logiczna AND. || Alternatywa logiczna OR. ?: Wyrazenie warunkowe z C. Ma ono postac wyraz1 ? wyraz2 : wyraz3. Jesli wyraz1 jest prawdziwe, to wartoscia wyrazenia jest wyraz2, w przeciwnym wypadku jest nia wyraz3. Obliczane jest wylacznie jedno z wyraz2 i wyraz3. = += -= *= /= %= ^= Przypisanie. Obslugiwane jest zarowno przypisanie absolutne (zmienna = wartosc) jak i przypisanie operatorowe (inne formy). Instrukcje sterujace Instrukcje sterujace sa nastepujace: if (warunek) instrukcja [ else instrukcja ] while (warunek) instrukcja do instrukcja while (warunek) for (wyraz1; wyraz2; wyraz3) instrukcja for (var in tablica) instrukcja break continue delete tablica[indeks] delete tablica exit [ wyrazenie ] { instrukcje } switch (wyrazenie) { case wartosc|wyraz-regul : instrukcja ... [ default: instrukcja ] } Instrukcje I/O Instrukcje I/O sa nastepujace: close(plik [, jak]) Zamyka otwarty plik, potok lub proces wspolbiezny (co-process). Opcjonalnego jak powinno sie uzywac wylacznie do zamykania jednego konca dwukierunkowego potoku do procesu wspolbieznego. Musi to byc wartosc lancuchowa, albo "to" albo "from". getline Ustawia $0 z nastepnego rekordu wejsciowego; ustawia NF, NR, FNR, RT. getline plik Wypisuje wyrazenia do pliku. Kazde wyrazenie jest rozdzielone wartoscia OFS. Rekord wyjsciowy jest zakonczony wartoscia ORS. printf fmt, lista-wyrazen Formatuje i wypisuje/ printf fmt, lista-wyrazen >plik Formatuje i wypisuje do pliku. system(cmd-line) Wywoluje polecenie systemowe cmd-line, i zwraca jego status wyjscia. (funkcja moze nie byc dostepna na systemach nie POSIX-owych). Pelne informacje o statusie zakonczenia sa dostepne pod adresem https://www.gnu.org/software/gawk/manual/html_node/I_002fO-Functions.html#I_002fO-Functions. Dozwolone sa tez dodatkowe przekierowania wejscia i wyjscia dla print i printf. print ... >> plik Dokleja wyjscie do pliku. print ... | polecenie Zapisuje do potoku. print ... |& polecenie Wysyla dane do procesu wspolbieznego lub gniazda (zob. tez podrozdzial Specjalne nazwy plikow). Funkcja getline zwraca 1 dla powodzenia, zero dla konca pliku oraz -1 jesli wystapil blad. Jesli wartosc errno(3) wskazuje, ze operacja wejscia/wyjscia moze byc ponowiona i ustawione jest PROCINFO["input", "RETRY"], to zamiast -1 zwracane jest -2 i mozna probowac wywolywac getline ponownie. W przypadku wystapienia bledu, ERRNO ustawiane jest na lancuch opisujacy problem. UWAGA: Niepowodzenie otwarcia dwukierunkowego gniazda powoduje zwrocenie niekrytycznego bledu do funkcji wywolujacej. Uzywajac potoku, procesu wspolbieznego lub gniazda do getline albo z print lub printf wewnatrz petli konieczne jest uzycie close() do utworzenia nowych instancji tego polecenia lub gniazda. AWK nie zamyka automatycznie potokow, gniazd ani procesow wspolbieznych gdy zwroca one EOF (koniec pliku). Wersje AWK instrukcji printf oraz funkcji sprintf() sa podobne do tych z C. Wiecej informacji pod adresem https://www.gnu.org/software/gawk/manual/html_node/Printf.html. Specjalne nazwy plikow Podczas przekierowan I/O przy uzyciu print czy tez printf do pliku, albo przy uzyciu getline z pliku, gawk rozpoznaje wewnetrznie pewne specjalne nazwy plikow. Te nazwy plikow umozliwiaja dostep do otwartych deskryptorow plikow, dziedziczonych po procesie rodzicielskim gawk'a (zazwyczaj powloce). Inne pliki specjalne zapewniaja dostep do informacji o uruchomionym procesie gawk. Z tych specjalnych nazw plikow mozna rowniez korzystac w wierszu polecen do okreslania plikow danych. Te nazwy to: - Standardowe wejscie. /dev/stdin Standardowe wejscie. /dev/stdout Standardowe wyjscie. /dev/stderr Standardowe wyjscie diagnostyczne. /dev/fd/n Plik zwiazany z otwartym deskryptorem pliku n. Ponizszych specjalnych nazw plikow mozna uzywac z operatorem procesu wspolbieznego |& do tworzenia witrualnych polaczen sieciowych TCP/IP: /inet/tcp/lport/rhost/rport /inet4/tcp/lport/rhost/rport /inet6/tcp/lport/rhost/rport Pliki dla polaczenia TCP/IP na lokalnym porcie lport do zdalnej stacji rhost na zdalnym porcie rport. Port 0 spowoduje, ze to system znajdzie port. /inet4 wymusi polaczenie IPv4, a /inet6 wymusi polaczenie IPv6. Zwykle /inet uzyje domyslnej wartosci systemowej (zapewne IPv4). Uzywalne tylko z dwukierunkowym operatorem wejscia/wyjscia |&. /inet/udp/lport/rhost/rport /inet4/udp/lport/rhost/rport /inet6/udp/lport/rhost/rport Podobnie, lecz uzywa UDP/IP zamiast TCP/IP. Obsluga UDP jest przestarzala i w przyszlosci bedzie usunieta. Funkcje numeryczne AWK ma nastepujace wbudowane funkcje arytmetyczne: atan2(y, x) Zwraca arcus tangens y/x w radianach. cos(wyraz) Zwraca cosinus z wyraz w radianach. exp(wyraz) funkcja wykladnicza. int(wyraz) Skraca do liczby calkowitej. log(wyraz) funkcja logarytmu naturalnego. rand() zwraca liczbe losowa N, pomiedzy zerem a jedynka tak, ze 0 <= N < 1. sin(wyraz) Zwraca sinus z wyraz w radianach. sqrt(wyraz) Zwraca pierwiastek kwadratowy wyraz. srand([wyraz]) Uzywa wyraz jako nowego ziarno dla generatora liczb losowych. Bez podanego wyraz, uzywa czasu dnia. Zwraca poprzednie ziarno generatora liczb losowych. Funkcje lancuchowe Gawk posiada nastepujace wbudowane funkcje lancuchowe; szczegolowy opis pod adresem https://www.gnu.org/software/gawk/manual/html_node/String-Functions. asort(s [, d [, jak] ]) Zwraca liczbe elementow w zrodlowej tablicy s. Sortuje zawartosc s z zastosowaniem zwyklych regul gawk do porownywania wartosci, zastepujac indeksy posortowanych wartosci s, kolejnymi liczbami calkowitymi, poczawszy od 1. Jesli podano opcjonalna tablice docelowa d, to najpierw s jest powielana do d, a nastepnie sortowana jest d, zas indeksy tablicy zrodlowej s pozostaja niezmienione. Opcjonalny lancuch jak reguluje kierunek i tryb porownania. Prawidlowe wartosci jak opisano pod adresem https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html#String-Functions. s i d moga wystepowac w tej samej tablicy; ma to sens tylko przy podaniu trzeciego argumentu. asorti(s [, d [, jak] ]) Zwraca liczbe elementow w zrodlowej tablicy s. Zachowanie jest takie jak w przypadku asort() z tym wyjatkiem, ze do sortowania sluza indeksy tablicy, a nie jej wartosci. Rezultatem jest tablica indeksowana numerycznie, ktorej wartosciami sa pierwotne indeksy. Pierwotne wartosci sa tracone; z tego powodu nalezy zapewnic druga tablice, jesli chce sie zachowac pierwotna. Zastosowanie opcjonalnego lancucha jak jest takie samo jak w przypadku asort(). Rowniez tutaj s i d moga byc w tej samej tablicy; to takze ma sens tylko przy podaniu trzeciego argumentu. gensub(r, s, h [, t]) W lancuchu docelowym t wyszukuje podlancuchy odpowiadajace wyrazeniu regularnemu r. Jezeli h jest lancuchem zaczynajacym sie od g lub G, to zastepuje wszystkie znalezione dopasowania r przez s. W przeciwnym wypadku, h jest liczba wskazujaca, ktore z kolejnych dopasowan r ma zostac zastapione. Jezeli nie podano t, to zamiast niego uzywane jest $0. Wewnatrz tekstu zastepujacego s, mozna posluzyc sie sekwencja \n, gdzie n jest cyfra od 1 do 9, wskazujaca na tekst dopasowany przez n-te podwyrazenie w nawiasach. Sekwencja \0 oznacza caly dopasowany tekst, tak samo jak znak &. W przeciwienstwie do sub() i gsub(), jako wynik funkcji zwracany jest zmieniony lancuch, zas pierwotny lancuch docelowy pozostaje nie zmieniony. gsub(r, s [, t]) kazdy podlancuch, odpowiadajacy wyrazeniu regularnemu r w lancuchu t, wymienia na lancuch s, i zwraca liczbe podmian. Jesli nie podano t, uzywa $0. Znak & w tekscie zastepujacym zostanie zastapiony faktycznie dopasowanym tekstem. Aby otrzymac literalny znak & nalezy uzyc \& (konieczne jest wpisanie tego jako "\\&"; zob. https://www.gnu.org/software/gawk/manual/html_node/Gory-Details.html#Gory-Details aby zapoznac sie z pelniejszym omowieniem regul znakow & oraz odwrotnych ukosnikow w tekscie zastepujacym dla funkcji sub(), gsub() i gensub()). index(s, t) Zwraca indeks lancucha t w lancuchu s lub zero, gdy t jest nieobecne (co implikuje, ze indeksy znakow zaczynaja sie od jedynki). length([s]) Zwraca dlugosc lancucha s lub dlugosc $0, jesli nie podano s. Przy argumencie bedacym tablica, length() zwraca liczbe elementow w tablicy. match(s, r [, a]) Zwraca pozycje w s, gdzie pojawia sie wyrazenie regularne r. Jesli nie podano r, zwracane jest zero. Jesli jest jednak obecne, to dodatkowo ustawiane sa zmienne RSTART i RLENGTH. Zauwaz, ze kolejnosc argumentow jest taka sama jak dla operatora ~: str ~ re. Pod adresem https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html#String-Functions dostepny jest opis, w jaki sposob nastepuje zapelnianie tablicy a, jesli sie ja poda. patsplit(s, a [, r [, seps] ]) Dzieli lancuch s na tablice a i tablice separatorow seps w miejscach rozdzielonych wyrazeniem regularnym r, i zwraca liczbe pol. Wartosciami elementow sa fragmenty s, ktore zostaly dopasowane przez r. Wartoscia seps[i] jest separator (byc moze null), ktory pojawil sie po a[i]. Wartoscia seps[0] jest wiodacy separator (byc moze null). Jesli pominieto r, zamiast niego uzywane jest FPAT. Na poczatku, tablice a i seps sa czyszczone. Podzial odbywa sie identycznie podzial pol przy FPAT. split(s, a [, r [, seps] ]) Dzieli lancuch s na tablice a i tablice separatorow seps, w miejscach rozdzielonych wyrazeniem regularnym r, i zwraca liczbe pol. Jesli pominieto r, zamiast niego uzywane jest FS. Na poczatku, czyszczone sa tablice a i seps. seps[i] jest separatorem pola dopasowanego przez r pomiedzy a[i] i a[i+1]. Podzial odbywa sie identycznie jak opisany powyzej podzial rekordu na pola. sprintf(fmt, lista-wyraz) wypisuje liste-wyraz wedlug fmt, i zwraca lancuch wyjsciowy. strtonum(str) Bada str, i zwraca jego numeryczna wartosc. Jesli str zaczyna sie od poczatkowego 0, to traktuje go jako liczbe osemkowa. Jesli str zaczyna sie od poczatkowego 0x lub 0X, to traktuje go jako liczbe szesnastkowa. W innym przypadku przyjmuje, ze jest to liczba dziesietna. sub(r, s [, t]) Podobne do gsub(), lecz podmienia tylko pierwszy odpowiadajacy podlancuch. Zwraca zero albo jeden. substr(s, i [, n]) Zwraca maksymalnie n-znakowy podlancuch lancucha s, zaczynajacy sie od pozycji i. Jesli pominieto parametr n, uzyta zostaje reszta s. tolower(str) Zwraca kopie lancucha str, w ktorej wszystkie wielkie litery zostaly zastapione malymi. Nie alfabetyczne znaki pozostaja bez zmian. toupper(str) Zwraca kopie lancucha str, w ktorej wszystkie male litery zostaly zastapione wielkimi. Nie alfabetyczne znaki pozostaja bez zmian. Gawk jest swiadomy wielobajtowosci. Oznacza to, ze index(), length(), substr() i match() dzialaja wobec znakow, nie bajtow. Funkcje czasu Gawk zapewnia nastepujace funkcje do pozyskiwania znacznikow czasowych i formatowania ich. Szczegolowy opis pod adresem https://www.gnu.org/software/gawk/manual/html_node/Time-Functions. mktime(okreslenie-daty [, znacznik-utc]) Przeksztalca okreslenie-daty na znacznik czasu w tej samej postaci, jaka jest zwracana przez systime() i zwraca wynik. Jesli obecny jest znacznik-utc i jest on niezerowy i niebedacy null, przyjmuje sie, ze czas jest w strefie czasu uniwersalnego (UTC), w innym przypadku przyjmuje sie, ze jest to czas lokalny. Jesli okreslenie-daty nie zawiera wymaganych elementow lub zwrocony czas jest poza zakresem, mktime() zwraca -1. Szczegoly okreslenia-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 wedlug wskazowek zawartych w zmiennej format. Jesli obecny jest znacznik-utc i jest on niezerowy i niebedacy null, przyjmuje sie, ze czas jest w strefie czasu uniwersalnego (UTC), w innym przypadku przyjmuje sie, ze jest to czas lokalny. Znacznik-czasu powinien byc taki sam, jak ten, zwracany przez systime(). Jesli brakuje parametru znacznik-czasu, uzywany jest biezacy czas dnia. Jezeli pominieto format, to uzywany jest domyslny format rownowazny formatowi wynikow z date(1). Domyslny format jest dostepny w PROCINFO["strftime"]. Zobacz specyfikacje funkcji strftime () w ISO C, aby zobaczyc jakie konwersje formatow sa na pewno dostepne. systime() Zwraca biezacy czas dnia w liczbach sekund od poczatku Epoki (czyli od polnocy UTC, 1 stycznia 1970 na systemach POSIX-owych). Funkcje operujace na bitach Gawk zapewnia ponizsze funkcje operujace na bitach. Dzialaja przez konwersje wartosci zmiennoprzecinkowych podwojnej precyzji na calkowite uintmax_t, wykonanie operacji, a nastepnie konwersje wyniku z powrotem na zmiennoprzecinkowy. Przekazanie ujemnych argumentow do ktorejs z tych funkcji spowoduje blad krytyczny. Funkcje: and(v1, v2 [, ...]) Zwraca bitowa koniunkcje AND wartosci podanych w liscie argumentow. Musi byc ich co najmniej dwa. compl(val) Zwraca bitowe uzupelnienie val. lshift(val, ile) Zwraca wartosc val, przesunieta w lewo o ile bitow. or(v1, v2 [, ...]) Zwraca bitowa alternatywe OR wartosci podanych w liscie argumentow. Musi byc ich co najmniej dwa. rshift(val, ile) Zwraca wartosc val, przesunieta w prawo o ile bitow. xor(v1, v2 [, ...]) Zwraca bitowa alternatywe wykluczajaca XOR wartosci podanych w liscie argumentow. Musi byc ich co najmniej dwa. Funkcje typu Nastepujace funkcje zapewniaja informacje zwiazane z typem ich argumentow. isarray(x) Zwraca prawde, jesli x jest tablica lub falsz w innym przypadku. typeof(x) Zwraca lancuch wskazujacy typ x. Lancuch przyjmie jedna z wartosci: "array", "number", "regexp", "string", "strnum", "unassigned", or "untyped". Funkcje internacjonalizacji Mozna uzywac wewnatrz programow AWK funkcji do tlumaczenia lancuchow podczas wykonania programu. Szczegoly opisano pod adresem https://www.gnu.org/software/gawk/manual/html_node/I18N-Functions.html#I18N-Functions. bindtextdomain(katalog [, domena]) Okresla katalog, w ktorym gawk szuka plikow .gmo, w przypadku gdy nie beda lub nie moga byc umieszczone w ,,standardowych" miejscach. Zwraca katalog, z ktorym jest ,,zwiazana" domena. Domyslna domena jest wartosc TEXTDOMAIN. Jesli katalog jest lancuchem pustym (""), to bindtextdomain() zwraca biezace wiazanie dla zadanej domeny. dcgettext(lancuch [, domena [, kategoria]]) Zwraca tlumaczenie lancucha w domenie tekstowej domena dla kategorii locale kategoria. Domyslna domena jest biezaca wartosc TEXTDOMAIN. Domyslna wartoscia kategorii jest "LC_MESSAGES". dcngettext(lancuch1, lancuch2, liczba [, domena [, kategoria]]) Zwraca forme mnoga uzywana dla tlumaczenia liczby lancucha1 i lancucha2 w domenie tekstowej domena dla kategorii locale kategoria. Domyslna domena jest biezaca wartosc TEXTDOMAIN. Domyslna wartoscia kategorii jest "LC_MESSAGES". Funkcje z wartosciami logicznymi Mozna tworzyc specjalne wartosci typu logicznego; wiecej informacji o dzialaniu i przyczynie ich istnienia opisano w podreczniku. mkbool(wyrazenie) W zaleznosci od wartosci logicznej wyrazenia, zwraca wartosc prawdy lub wartosc falszu. Wartosc prawdy ma wartosc numeryczna jeden. Wartosc falszu ma wartosc numeryczna zero. FUNKCJE UZYTKOWNIKA Funkcje w AWK sa definiowane nastepujaco: function nazwa(lista parametrow) { instrukcje } Funkcje sa wykonywane po wywolaniu ich z wyrazen wystepujacych we wzorcach lub akcjach. Do tworzenia instancji parametrow formalnych, zadeklarowanych w funkcji uzywane sa parametry faktyczne uzyte w wywolaniu funkcji. Tablice sa przekazywane przez wskazanie, inne zmienne przez wartosc. Zmienne lokalne sa deklarowane jako dodatkowe parametry w liscie parametrow. Konwencja polega na separowaniu zmiennych lokalnych od parametrow dodatkowymi spacjami w liscie parametrow. Na przyklad: function f(p, q, a, b) # a i b sa lokalne { ... } /abc/ { ... ; f(1, 2) ; ... } Lewy nawias w wywolaniu funkcji musi wystepowac bezposrednio za nazwa funkcji, bez wtraconego odstepu. Ograniczenie to nie odnosi sie do funkcji wbudowanych, ktore sa opisane powyzej. Funkcje moga wolac siebie nawzajem i moga byc rekurencyjne. Parametry funkcji uzywane jako zmienne lokalne sa podczas wywolania funkcji inicjalizowane na lancuch pusty i liczbe zero. Chcac, by funkcja zwracala wartosc nalezy posluzyc sie skladnia: return wyraz. Wartosc zwracana przez funkcje jest niezdefiniowana jesli nie podano wartosci zwracanej lub funkcja konczy prace bez jawnej instrukcji powrotu. Jezeli uzyto --lint, to gawk ostrzega o wywolaniach niezdefiniowanych funkcji podczas analizy skladni, a nie w czasie wykonania. Wywolanie niezdefiniowanej funkcji w czasie wykonania powoduje blad krytyczny. Funkcje mozna wywolywac niebezposrednio. W tym celu nalezy przypisac nazwe funkcji, ktora ma byc wywolana, jako lancuch, do zmiennej. Nastepnie zmienna mozna podac jakby byla nazwa funkcji, poprzedzajac ja znakiem @, jak w przykladzie: function mojafunkcja() { print "wywolano mojafunkcja" ... } { ... ta_funkcja = "mojafunkcja" @ta_funkcja() # wywolanie mojafunkcja poprzez ta_funkcja ... } Jezeli uzyto --lint, to gawk ostrzega o wywolaniach niezdefiniowanych funkcji podczas analizy skladni, a nie w czasie wykonania. Wywolanie niezdefiniowanej funkcji w czasie wykonania powoduje blad krytyczny. DYNAMICZNE LADOWANIE NOWYCH FUNKCJI Mozna dynamicznie dodawac nowe funkcje napisane w C lub C++ do pracujacego interpretera gawk instrukcja @load. Dokladne szczegoly wykraczaja poza zakres tej strony podrecznika; zob. https://www.gnu.org/software/gawk/manual/html_node/Dynamic-Extensions.html#Dynamic-Extensions. SYGNALY Profiler gawk przyjmuje dwa sygnaly. SIGUSR1 powoduje, ze zrzuca on profil i stos wywolan funkcji do pliku profilu, ktorym jest albo awkprof.out, albo plik podany z opcja --profile. Nastepnie kontynuuje dzialanie. SIGHUP powoduje, ze gawk zrzuca profil i stos wywolan funkcji a nastepnie konczy prace. INTERNACJONALIZACJA Stale lancuchowe sa ciagami znakow ujetymi w cudzyslowy. W srodowiskach innych niz angielskojezyczne, mozliwe jest oznakowanie lancuchow w programie AWK jako wymagajacych tlumaczenia na wlasny jezyk narodowy. Lancuchy takie sa oznaczone w programie AWK przez poczatkowy znak podkreslenia (,,_"). Na przyklad, gawk 'BEGIN { print "hello, world" }' zawsze wypisuje hello, world. Ale, gawk 'BEGIN { print _"hello, world" }' moze wypisac bonjour, monde we Francji. Wiecej informacji na temat krokow potrzebnych do tworzenia i dzialania, dajacego sie tlumaczyc programu K, opisano pod adresem https://www.gnu.org/software/gawk/manual/html_node/Internationalization.html#Internationalization. ROZSZERZENIA GNU Gawk ma zbyt wiele rozszerzen do POSIX awk. Sa one opisane pod adresem https://www.gnu.org/software/gawk/manual/html_node/POSIX_002fGNU.html. Wszystkie rozszerzenia mozna wylaczyc, wywolujac gawk z opcja --traditional lub --posix. ZMIENNE SRODOWISKOWE Do podania listy katalogow przegladanych przez gawk podczas poszukiwania plikow zadanych opcjami -f, --file, -i i --include oraz dyrektywami @include i @nsinclude, mozna posluzyc sie zmienna srodowiskowa AWKPATH. Jesli pierwotne wyszukiwanie nie powiedzie sie, sciezka jest przeszukiwana ponownie, z dolaczonym do nazwy pliku .awk. Do podania listy katalogow przegladanych przez gawk podczas poszukiwania plikow zadanych opcjami -l i --load mozna posluzyc sie zmienna srodowiskowa AWKLIBPATH. Zmienna srodowiskowa GAWK_PERSIST_FILE, jesli obecna, wskazuje na plik, ktory sluzy jako magazyn pamieci trwalej. Wiecej szczegolow w GAWK: Efektywne programowanie w AWK. Zmienna srodowiskowa GAWK_READ_TIMEOUT moze posluzyc do okreslenia czasu przeterminowania, w milisekundach, na oczekiwanie na wejscie na terminalu, w potoku lub przez komunikacje dwustronna, w tym gniazda. W przypadku polaczen do stacji zdalnej za pomoca gniazda, GAWK_SOCK_RETRIES reguluje liczbe ponownych prob, a GAWK_MSEC_SLEEP interwal miedzy nimi. Interwal okresla sie w milisekundach. W systemach nieobslugujacych usleep(3), wartosc jest zaokraglana w gore, do pelnych sekund. Jesli w srodowisku istnieje zmienna POSIXLY_CORRECT to gawk zachowuje sie tak, jakby podano mu w wierszu polecen opcje --posix. Jesli podano opcje --lint, gawk wyda ostrzezenie o tym efekcie. STATUS ZAKONCZENIA Jesli instrukcja exit zostanie uzyta z wartoscia, to gawk wychodzi z podana w niej wartoscia numeryczna. W pozostalych przypadkach, jesli przy wykonaniu nie napotkano na problemy, gawk wychodzi z wartoscia stalej C EXIT_SUCCESS. Zwykle wynosi zero. Jesli wystapi blad, gawk wychodzi z wartoscia stalej C EXIT_FAILURE. Zwykle wynosi jeden. Jesli gawk wyjdzie z powodu bledu krytycznego, status zakonczenia wynosi 2. W systemach innych niz POSIX, wartosc te mozna przypisac do EXIT_FAILURE. INFORMACJA O WERSJI Ta strona podrecznika man opisuje gawk, w wersji numer 5.4. AUTORZY Oryginalna wersja UNIX awk byla opracowana i zaimplementowana przez Alfreda Aho, Petera Weinbergera i Briana Kernighana z Bell Laboratories. Aktualnym opiekunem jest Ozan Yigit. Brian Kernighan wciaz okazjonalnie rozwija program. Paul Rubin i Jay Fenlason, z Free Software Foundation, napisali wersje gawk, zgodna z oryginalna wersja awk, rozprowadzana w Seventh Edition UNIX. John Woods wprowadzil wiele poprawek. David Trueman, z pomoca Arnolda Robbinsa, uczynil gawk zgodnym z nowa wersja UNIX awk. Arnold Robbins jest biezacym opiekunem projektu. Pelna lista tworcow gawk jest dostepna w dokumentacji programu oraz w podreczniku GAWK: Efektywne programowanie w AWK. Plik README w dystrybucji gawk zawiera aktualne informacje o opiekunach oraz obecnie obslugiwanych portach. ZGLOSZENIA BLEDOW I ZAPYTANIA Po napotkaniu bledu w gawk, prosze skorzystac z programu gawkbug(1), aby go zglosic. Pelna instrukcja zglaszania bledow jest dostepna pod adresem https://www.gnu.org/software/gawk/manual/html_node/Bugs.html. Prosimy o uwazne przeczytanie i stosowanie sie do niej. Czyni to zglaszanie i poprawianie bledow znacznie latwiejsze dla wszystkich zaangazowany. Naprawde! Z drugiej strony, jesli ma sie pytanie o to, jak wykonac dane zadanie uzywajac awk lub gawk, mozna wyslac wiadomosc na adres help-gawk@gnu.org z prosba o pomoc. USTERKI Opcja -F niekoniecznie ma wlasciwosc przypisywania zmiennych; pozostaje tylko dla zgodnosci wstecznej. Niniejszy podrecznik systemowy jest zbyt obszerny, gawk ma zbyt wiele funkcji. ZOBACZ TAKZE 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 zrodlami gawk source. Biezaca wersja tego dokumentu jest dostepna pod adresem https://www.gnu.org/software/gawk/manual. Dokumentacja GNU gettext, dostepna pod adresem https://www.gnu.org/software/gettext. PRZYKLADY Wypisz i posortuj nazwy zgloszeniowe (login) wszystkich uzytkownikow: BEGIN { FS = ":" } { print $1 | "sort" } Zlicz wiersze w pliku: { nlines++ } END { print nlines } Poprzedz kazdy wiersz jego numerem w pliku: { print FNR, $0 } Lacz i numeruj wiersze (wariacja tematu): { print NR, $0 } Uruchom zewnetrzne polecenie dla okreslonych wierszy danych: tail -f access_log | awk '/myhome.html/ { system("nmap " $1 ">> logdir/myhome.html") }' KOPIOWANIE NINIEJSZEJ DOKUMENTACJI Copyright (C) 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. TLUMACZENIE Tlumaczenie niniejszej strony podrecznika: Przemek Borys i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Free Software Foundation 10 lutego 2026 r. GAWK(1)