| GAWK(1) | Narzędzia | GAWK(1) |
gawk - język wyszukiwania i przetwarzania wzorców
gawk [ opcje w stylu POSIX lub GNU ] -f
plik-programu [ -- ] plik ...
gawk [ opcje w stylu POSIX lub GNU ] [ -- ]
tekst-programu plik ...
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.
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.
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.
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 #!.
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.
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.
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.
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.
Program AWK składa się z sekwencji opcjonalnych dyrektyw, instrukcji wzorzec-akcja oraz opcjonalnych definicji funkcji.
@include "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.
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.
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 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 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.
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.
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.
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.
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:
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.
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.
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.
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 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ł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.
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 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.
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 w AWK, w kolejności malejącego priorytetu, to
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 są następujące:
Dozwolone są też dodatkowe przekierowania wejścia i wyjścia dla print i printf.
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.
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:
Poniższych specjalnych nazw plików można używać z operatorem procesu współbieżnego |& do tworzenia witrualnych połączeń sieciowych TCP/IP:
AWK ma następujące wbudowane funkcje arytmetyczne:
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.
Gawk jest świadomy wielobajtowości. Oznacza to, że index(), length(), substr() i match() działają wobec znaków, nie bajtów.
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.
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:
Następujące funkcje zapewniają informacje związane z typem ich argumentów.
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.
Domyślną domeną jest wartość TEXTDOMAIN. Jeśli katalog jest łańcuchem pustym (""), to bindtextdomain() zwraca bieżące wiązanie dla zadanej domeny.
Można tworzyć specjalne wartości typu logicznego; więcej informacji o działaniu i przyczynie ich istnienia opisano w podręczniku.
Funkcje w AWK są definiowane następująco:
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.
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.
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ę.
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,
zawsze wypisuje hello, world. Ale,
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.
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.
Do podania listy katalogów przeglądanych przez gawk podczas poszukiwania plików zadanych opcjami -f, --file, -i i --include oraz dyrektywą @include 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.
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.
Ta strona podręcznika man opisuje gawk, w wersji numer 5.3.
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.
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.
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.
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.
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") }'
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 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 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 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.
| 23 marca 2025 r. | Free Software Foundation |