Provided by:
manpages-pl_20060617-2_all 
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...
pgawk [opcje w stylu POSIX lub GNU] -f plik-programu [--] plik...
pgawk [opcje w stylu POSIX lub GNU] [--] tekst-programu plik...
OPIS
Gawk jest implementacją GNU języka programowania AWK. Odpowiada on
definicji tego języka z POSIX 1003.2 Command Language And Utilities
Standard. Wersja ta jest z kolei oparta na opisie z The AWK
Programming Language, napisanym przez Aho, Kernighana i Weinbergera, z
dodatkowymi właściwościami, zdefiniowanymi w wersji awk z SysVR4. Gawk
udostępnia również najświeższe rozszerzenia awk z Bell Laboratories
oraz parę rozszerzeń specyficznych dla GNU.
Pgawk jest profilującą wersją gawk. W każdym aspekcie jest identyczny
z gawk, z wyjątkiem tego, że programy działają wolniej, a na
zakończenie automatycznie tworzony jest profil wykonania w pliku
awkprof.out. Zobacz opcja --profile, poniżej.
Wiersz poleceń składa się z opcji dla gawk, tekstu programu (jeśli nie
podano go poprzez opcję -f lub --file) i wartości, które mają być
udostępnione w predefiniowanych zmiennych ARGC i ARGV.
OPCJE
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.
Zgodnie ze standardem POSIX, specyficzne dla gawk opcje są przekazywane
przez argumenty opcji -W. Można podać wiele opcji -W, lub wiele jej
argumentów (oddzielonych przecinkami, lub ujętych w cudzysłowy i
oddzielonych białymi spacjami). Wielkość liter w argumentach
przekazanych opcji -W jest ignorowana. Każda opcja -W ma odpowiadająca
sobie długą opcję w stylu GNU, jak opisano niżej. 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).
Gawk przyjmuje następujące, wymienione alfabetycznie, opcje.
-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 bloku BEGIN
programu AWK.
-f plik-programu
--file=plik-programu
Odczytaj źródło programu AWK z pliku plik-programu, zamiast
odczytywać go z pierwszego argumentu wiersza poleceń. Można
użyć wielu opcji -f (lub --file).
-mf=NNN
-mr=NNN
Ustaw limity pamięci na wartość NNN. Flaga f ustawia maksymalną
liczbę pól, a flaga r ustawia maksymalny rozmiar rekordu. Te
dwie flagi i opcja -m pochodzą z wersji AT&T Bell Laboratories
research UNIX awk. Są one ignorowane w gawk, gdyż nie posiada
on predefiniowanych limitów.
-W compat
-W traditional
--compat
--traditional
Pracuje w trybie zgodnoci. W trybie tym, gawk zachowuje się
identycznie z UNIX awk; nie jest rozpoznawane żadne ze
specyficznych dla GNU rozszerzeń. Postać --traditional jest
preferowana. Zobacz ROZSZERZENIA GNU, dla dalszych informacji.
-W copyleft
-W copyright
--copyleft
--copyright
Wypisuje krótką wersję informacji o kopiowaniu (na standardowe
wyjście).
-W dump-variables[=plik]
--dump-variables[=plik]
Wypisuje do pliku posortowaną listę zmiennych globalnych, ich
typoów i końcowych wartości. Jeśli nie podano pliku, to gawk
używa pliku o nazwie awkvars.out w katalogu bieżącym.
Lista wszystkich zmiennych globalnych to dobry sposób na
wyszukanie błędów typograficznych w programach. Może się też
przydać, gdy masz wielki program z mnóstwem funkcji a chcesz się
upewnić, że nie używają one przypadkiem ze zmiennych globalnych,
które uważasz za lokalne. (Szczególnie łatwo pomylić się przy
prostych nazwach zmiennych, jak i, j, i tak dalej.)
-W help
-W usage
--help
--usage
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).
-W lint[=fatal]
--lint[=fatal]
Daje ostrzeżenia o konstrukcjach, które są pokraczne lub
nieprzenośne dla innych implementacji AWK. Z opcjonalnym
argumentem fatal, ostrzeżenia lint stają się błędami
krytycznymi. Może to drastyczne, ale korzystanie z tej opcji na
pewno zachęci do pisania czystszych programów AWK.
-W lint-old
--lint-old
Daje ostrzeżenia o konstrukcjach, które nieprzenośne na
pierwotną wersję Uniksowego awk.
-W gen-po
--gen-po
Przegląda i analizuje program AWK program, i tworzy na
standardowym wyjściu plik formatu GNU .po, zawierający wpisy dla
wszystkich podlegających lokalizacji łańcuchów w programie. Sam
program nie jest wykonywany. Więcej szczegółów o plikach .po
można znaleźć w pakiecie dystrybucyjnym GNU gettext.
-W non-decimal-data
--non-decimal-data
Rozpoznaje wartości ósemkowe i szesnastkowe w danych
wejściowych. Uywaj tej opcji ze szczegln ostronoci!
-W posix
--posix
Włącza tryb zgodnoci, w którym obowiązują następujące dodatkowe
ograniczenia:
o sekwencje specjalne \x nie są rozpoznawane.
o Przy FS ustawionym na pojedynczą spację jako separatory pól
działają tylko spacje i tabulatory, znaki nowej linii nie są
separatorami pól.
o Nie można kontynuować linii po ? i :.
o Synonim `func' dla słowa kluczowego `function' nie jest
rozpoznawany.
o Operatory ** i **= nie mogą być używane zamiast ^ i ^=.
o Nie jest dostępna funkcja fflush().
-W profile[=plik_prof]
--profile[=plik_prof]
Wysyła dane profilowania do pliku_prof. Domyślnie jest to
awkprof.out. Uruchomiony z gawk, profil jest tylko "ładnie
wypisaną" wersją programu. Uruchomiony z pgawk, profil zawiera
liczbę wykonań każdej instrukcji programu (na lewym marginesie)
oraz liczbę wywołań funkcji dla każdej funkcji użytkownika.
-W re-interval
--re-interval
Włącz użycie wyrażeń powtarzanych (interval expressions) w
dopasowywaniu wyrażeń regularnych (patrz poniżej
Wyrażeniaregularne). Wyrażenia powtarzane nie były tradycyjnie
dostępne w języku AWK. Standard POSIX dodał je dla uzyskania
wzajemnej zgodności awk i egrep. Jednak ich użycie
najprawdopodobniej da błędy w starych programach AWK, zatem gawk
udostępnia je tylko wtedy, gdy zażądano tego niniejszą opcją lub
podano opcję --posix.
-W source=tekst-programu
--source=tekst-programu
Używa tekst-programu jako kodu źródłowego programu AWK. Opcja
ta pozwala na łatwe łączenie funkcji bibliotecznych (używanych
poprzez opcje -f i --file) z kodem źródłowym wprowadzanym w
wierszu poleceń. Jest to przeznaczone przede wszystkim dla
średnio dużych programów AWK, używanych w skryptach powłokowych.
Forma -W source= tej opcji używa reszty argumentu wiersza
poleceń jako tekstu programu; dalsze opcje -W nie będą
rozpoznawane w tym samym argumencie.
-W version
--version
Wypisuje informację o wersji tej konkretnej kopii gawk (na
standardowe wyjście). Jest to przydatne przede wszystkim do
zdobywania informacji, czy bieżąca kopia gawk, którą posiadasz
na systemie jest aktualna. Przydaje się także przy zgłaszaniu
błędów. (Według GNU Coding Standards (Standardów Kodowania GNU),
opcje te powodują natychmiastowe, zakończone powodzeniem
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]. Istnieje głównie
dla utrzymania spójności z konwencją przetwarzania argumentów
używaną w większości programów POSIX-owych.
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ć. Przydaje się to w
praktyce do uruchamiania programów AWK przez mechanizm "#!"
interpretera.
WYWOŁANIE PROGRAMU AWK
Program AWK składa się z sekwencji instrukcji wzorzec-akcja oraz
opcjonalnych definicji funkcji.
wzorzec { instrukcje akcji }
function nazwa(lista parametrw) { instrukcje }
Gawk najpierw odczytuje źródło programu z podanych plikw-programu.
Gawk czyta tekst programu tak, jakby wszystkie pliki-programu zostały
połączone ze sobą w całość. Przydaje się do budowania bibliotek funkcji
AWK, bez konieczności włączania ich do każdego nowego programu AWK,
który z nich korzysta. Umożliwia to również łączenie funkcji
bibliotecznych z programami z wiersza poleceń.
Zmienna środowiskowa AWKPATH określa ścieżkę przeszukiwania, używaną do
znajdowania plików źródłowych podanych w opcji -f. 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.
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 blokach BEGIN (jeśli istnieją), a następnie zaczyna
odczytywać każdy z plików, podanych w tablicy ARGV. 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żdego bloku BEGIN.) Ten sposób
inicjalizowania zmiennych najbardziej przydaje się do dynamicznego
nadawania wartości zmiennym, których AWK używa do określania sposobu, w
jaki wejście rozbijane jest na pola i rekordy. Jest też użyteczny do
kontroli stanu, jeśli zachodzi potrzeba wielokrotnego czytania danego
pliku danych.
Jeśli wartość konkretnego elementu ARGV jest pusta (""), to gawk ją
pomija.
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 bloku END.
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. AWK posiada również
tablice jednowymiarowe; symulowane mogą być również tablice
wielowymiarowe. Podczas działania programu ustawianych jest kilka
predefiniowanych zmiennych; będą one opisane niżej.
Rekordy
Zwykle rekordy rozdzielane są znakami nowej linii [czyli rekordem jest
pojedyncza linia]. Możesz kontrolować sposób, w jaki będą separowane
rekordy przypisując wartość wbudowanej zmiennej RS Jeżeli zawiera ona
pojedynczy znak, to jest on ogranicznikiem rekordów. W przeciwnym
przypadku, RS jest wyrażeniem regularnym. Tekst wejściowy pasujący do
tego wyrażenia rozdziela rekord. Jednakże, w trybie zgodności do
rozdzielania rekordów zostanie użyty tylko jego pierwszy znak. jeżeli
RS jest ustawiony na łańcuch pusty, to rekordy rozdzielane są pustymi
liniami. W tym przypadku znak nowej linii zawsze działa jako
ogranicznik pola, oprócz wartości ogranicznika ustawionej przez FS.
Pola
Po przeczytaniu każdego rekordu wejściowego, gawk rozbija go na pola,
używając do tego celu wartości separatora pól, FS. Jeśli FS jest
pojedynczym znakiem, to pola są rozdzielane tym właśnie znakiem. W
przeciwnym wypadku FS powinien być wyrażeniem regularnym. W szczególnym
wypadku, kiedy FS jest pojedynczą spacją, pola są oddzielane dowolną
ilością białych spacji (spacji, tabulatorów, nowych linii). (Ale patrz
omówienie --posix). UWAGA: Wartość zmiennej IGNORECASE (patrz niżej)
również wpływa na sposób rozdzielania pól i rekordów (w wypadku gdy
odpowiednio FS bądź RS jest wyrażeniem regularnym).
Jeśli zmienną FIELDWIDTHS ustawiono na listę oddzielonych spacjami
liczb, to każde pole powinno mieć stałą szerokość, zaś gawk dokonuje
podziału przy użyciu podanych szerokości. Wartość FS jest wtedy
ignorowana. Przyznanie zmiennej FS nowej wartości unieważnia użycie
FIELDWIDTHS, i przywraca domyślne zachowanie.
Do każdego pola w rekordzie wejściowym można odwołać się przez jego
pozycję, $1, $2, itd. $0 jest całym rekordem (zwykle linią). Do pól
nie musisz się odwoływać przez stałe:
n = 5
print $n
wypisze piąte pole rekordu wejściowego.
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 poowoduje
również ponowne przetworzenie wartości zmiennej $0, w której pola
zostaną rozdzielone 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.
Wbudowane zmienne
Wbudowanymi zmiennymi Gawk są:
ARGC Liczba argumentów wiersza poleceń (nie liczy opcji
przekazanych gawk, ani źródła programu).
ARGIND Indeks w tablicy ARGV bieżąco przetwarzanego pliku.
ARGV Tablica argumentów wiersza poleceń. Tablica ta jest
indeksowana od zera do ARGC - 1. Dynamiczna zmiana
zawartości ARGV może sterować plikami używanymi jako dane.
BINMODE Na systemach nie-POSIX-owych, określa użycie trybu
"binarnego" do wszystkich operacji wejścia/wyjścia plików.
Numeryczne wartości 1, 2 lub 3 oznaczają, że binarne
wejście/wyjście powinno zostać użyte dla, odpowiednio,
plików wejściowych, wyjściowych, lub wszystkich plików.
Wartości łańcuchowe: "r" lub "w" oznaczają używanie
binarnego wejścia/wyjścia dla, że plików, odpowiednio,
wejściowych lub wyjściowych. Wartości łańcuchowe: "rw" lub
"wr" oznaczają, że binarne wejście/wyjście powinno być
użyte dla wszystkich plików. Wszystkie inne wartości
łańcuchowe są traktowane jak "rw", ale powodują komunikat
ostrzegawczy.
CONVFMT Format konwersji dla liczb, domyślnie "%.6g".
ENVIRON Tablica zawierająca wartości bieżącego środowiska.
Tablica ta jest indeksowana zmiennymi
środowiskowowymi, każdy element tablicy jest
wartością danej zmiennej (np. ENVIRON["HOME"] może
mieć wartość /u/arnold). Zmiana tej tablicy nie
wpłynie na środowisko widziane przez programy, które
gawk wywołuje przez przekierowania lub przy użyciu
funkcji system().
ERRNO Jeśli pojawi się błąd systemowy podczas
przekierowywania dla getline, podczas odczytu dla
getline lub podczas close(), to ERRNO będzie
zawierać łańcuch opisujący błąd. Podlega on
tłumaczeniu przy ustawieniach locale innych niż
angielskie.
FIELDWIDTHS Jest rozdzieloną białymi spacjami 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).
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 bloku BEGIN (chyba że
zostanie nadana przez getline).
FNR Liczba rekordów wejściowych w bieżącym pliku
wejściowym.
FS Separator pól wejściowych, domyślnie spacja.
IGNORECASE Określa wrażliwość na wielkości znaków w operacjach
na wyrażeniach regularnych. Jeśli zmienna IGNORECASE
ma wartość niezerową, to porównywanie wzorców w
regułach, rozdzielanie pól przez FS, rozdzielanie
rekordów przez RS, dopasowywanie wyrażeń regularnych
przez ~ i !~, oraz wbudowane funkcje gsub(),
index(), match(), split() i sub(), będą ignorować
wielkość liter podczas operacji na wyrażeniach
regularnych. UWAGA: Ustawienie to nie wpływa na
indeksowanie tablic, ani na funkcję asort().
Tak więc jeśli IGNORECASE nie jest równe zero, /aB/
odpowiada wszystkim następującym łańcuchom -- "ab",
"aB", "Ab", i "AB". Jak ze wszystkimi zmiennymi
AWK, początkowa wartość IGNORECASE jest zerem, więc
operacje na wyrażeniach regularnych są wrażliwe na
wielkość znaków. W Unixie przy ignorowaniu wielkości
znaków używany jest pełny zestaw znaków ISO-8859-1
Latin-1.
LINT Zapewnia dynamiczne sterowanie opcją --lint z
wnętrza programu AWK. Gdy jest prawdziwe, gawk
wypisuje ostrzeżenia lint. Gdy fałszywe -- nie
wypisuje. Kiedy ma przypisaną wartość łańcuchową
"fatal", ostrzeżenia lint stają się błędami
krytycznymi, dokłądnie tak samo, jak przy
--lint=fatal. Każda inna wartość prawdziwa wypisuje
tylko ostrzeżenia.
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. PROCINFO Elementy tej tablicy umożliwiają
dostęp do informacji o działającym programie AWK. W
niektórych systemach w tablicy mogą istnieć elementy
od "group1" aż do "groupn" dla pewnego n, będącego
liczbą grup dodatkowych, do których należy program.
Do sprawdzenia tych elementów użyj operatora in. Na
pewno są dostępne następujące elementy:
PROCINFO["egid"] wartość funkcji systemowej
getegid(2).
PROCINFO["euid"] wartość funkcji systemowej
geteuid(2).
PROCINFO["FS"] "FS", jeśli działa podział na
pola za pomocą FS, lub
"FIELDWIDTHS", jeśli działa
podział na pola za pomocą
FIELDWIDTHS.
PROCINFO["gid"] wartość funkcji systemowej
getgid(2).
PROCINFO["pgrpid"] ID grupy procesów bieżącego
procesu.
PROCINFO["pid"] ID bieżącego procesu.
PROCINFO["ppid"] ID procesu macierzystego dla
bieżącego procesu.
PROCINFO["uid"] wartość funkcji systemowej
getuid(2).
RS Separator rekordów wejściowych, domyślnie
nowa linia. Jeśli RS ma wartość łańcucha
zerowego, to rekordy są oddzielane pustymi
liniami. Gdy RS jest ustawiony na łańcuch
zerowy, to znak nowej linii zawsze działa jak
separator pola, oprócz działania
jakiejkolwiek wartości zmiennej FS.
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 Znak, używany do separacji wielokrotnych
indeksów w elementach tablicowych, domyślnie
jest to "\034".
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 oczekiwany indeks
[łańcuchowy], można użyć operatora in, który ma
zastosowanie przede wszystkim w instrukcjach if lub
while.
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.]
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.
Typy zmiennych i konwersje
Zmienne oraz pola mogą być liczbami
(zmiennoprzecinkowymi), łańcuchami lub jednym i drugim
naraz. 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, dodaj do
niej 0; aby wymusić traktowanie jej jako łańcucha, doklej
do niej łańcuch zerowy.
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).
Tak więc, przy
CONVFMT = "%2.2f"
a = 12
b = a ""
zmienna b uzyskuje wartość łańcuchową "12", a nie
"12.00".
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.
Zwróć uwagę, że standard POSIX stosuje pojęcie "łańcucha
numerycznego" wszędzie, nawet do stałych łańcuchowych.
Jednak jest to oczywiście nieprawidłowe i gawk tego nie
robi. (Na szczęście, poprawiono to w następnej wersji
standardu.)
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() będących
łańcuchami numerycznymi. Podstawową koncepcją jest to,
że wyglądające na numeryczne dane z wejcia uytkownika,
i tylko one, są traktowane w opisany sposób.
Niezainicjalizowane zmienne mają wartość numeryczną zero
i łańcuchową "" (zero lub pusty łańcuch).
Stałe ósemkowe i szesnastkowe
Poczynając od wersji 3.1 gawk , 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 ("). Wewnątrz łańcuchów rozpoznawane są pewne
sekwencje specjalne, jak w C. Są to:
\\ dosłowny odwrotny ukośnik (backslash)
\a znak dzwonka, "alert"; zazwyczaj znak ASCII BEL
\b backspace
\f wysuw strony (form-feed)
\n znak nowej linii (newline).
\r powrót karetki (carriage return).
\t tabulacja pozioma (horizontal tab).
\v tabulacja pionowa (vertical tab).
\xcyfry hex
Znak reprezentowany przez łańcuch cyfr
szesnastkowych występujących po \x. Tak jak w ANSI
C, wszystkie kolejne cyfry szesnastkowe uważane są
za część sekwencji specjalnej. (Ta cecha powinna
nam coś mówić o projektowaniu języków przez
komitety.) Np., "\x1B" jest znakiem ASCII ESC
(escape).
\ddd Znak reprezentowany przez 1-, 2- lub 3-cyfrową
sekwencję cyfr ósemkowych. Np., "\033" jest znakiem
ASCII ESC (escape).
\c Dosłowny znak c.
Sekwencji specjalnych można też używać wewnątrz stałych
wyrażeń regularnych (np., /[ \t\f\n\r\v]/ dopasowuje
białe znaki).
W trybie zgodności, znaki reprezentowane przez ósemkowe
lub szesnastkowe sekwencje specjalne są traktowane
dosłownie, jeśli użyto ich w stałych wyrażeniach
regularnych. Zatem, /a\52b/ jest równoważnikiem /a\*b/.
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 linii. Do oddzielania instrukcji można używać
pustych linii. Zwykle instrukcja kończy się wraz z nową
linią, jednak nie jest to regułą w przypadku linii
kończących się na ",", "{", "?", ":", "&&" lub "||". Dla
liniach kończących się na do lub else również wystąpi
automatyczna kontynuacja instrukcji w następnej linii. W
innych wypadkach, linia może być kontynuowana przez
zakończenie jej znakiem "\"; w takim wypadku znak nowej
linii jest ignorowany.
Wiele instrukcji można też zgrupować w jednej linii,
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
/wyraenie regularne/
wyraenie 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 pojedynczym bloku BEGIN. Są one
wykonywane przed rozpoczęciem odczytywania danych
wejściowych. Podobnie, wszelkie bloki 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ę.
Dla wzorców /wyrae regularnych/ powiązana instrukcja
wykonywana jest dla każdego rekordu wejściowego, który
odpowiada zadanemu wyrażeniu regularnemu. Wyrażenia
regularne są tymi samymi wyrażeniami, które można spotkać
w egrep(1), i są podsumowane niżej.
wyraenie 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.
Wyrażenia regularne
Wyrażenia regularne są rozszerzoną formą tego, co można
znaleźć w egrep. Składają się one z następujących
znaków:
c dopasowuje nie-specjalny znak c.
\c dopasowuje dosłowny znak c.
. dopasowuje dowolny znak wcznie ze znakiem
nowej linii.
^ dopasowuje początek łańcucha.
$ dopasowuje koniec łańcucha.
[abc...] lista znaków, dopasowuje dowolny ze znaków
abc....
[^abc...] zanegowana lista znaków, dopasowuje wszystkie
znaki poza abc....
r1|r2 alternatywa: dopasowuje albo r1 albo r2.
r1r2 konkatenacja: dopasowuje r1, a następnie r2.
r+ dopasowuje jeden lub więcej r-ów.
r* dopasowuje zero lub więcej r-ów.
r? dopasowuje zero lub jeden r.
(r) grupowanie: dopasowuje r.
r{n}
r{n,}
r{n,m} Jedna lub dwie liczby w nawiasach klamrowych
opisują wyraenie powtarzane. Jeżeli w
nawiasach jest jedna liczba, to poprzedzające
wyrażenie regularne r powtarzane jest n razy.
Jeżeli użyto dwu rozdzielonych przecinkiem
liczb, to r powtarzane jest od n do m razy.
Jeżeli w nawiasach jest jedna liczba, z
następującym po niej przecinkiem to r
powtarzane jest co najmniej n razy.
Wyrażenia powtarzane dostępne są tylko wtedy,
gdy w wierszu poleceń użyto albo opcji --posix
albo --re-interval.
\y dopasowuje pusty łańcuch na początku bądź na
końcu słowa.
\B dopasowuje pusty łańcuch wewnątrz słowa.
\< dopasowuje pusty łańcuch na początku słowa.
\> dopasowuje pusty łańcuch na końcu słowa.
\w dopasowuje dowolny znak wchodzący w skład słów
(literę, cyfrę lub podkreślenie). [Nie
obejmuje to, niestety polskich znaków
diakrytycznych. Sekwencje dotyczące
dopasowywania słów oczywiście również nie
uwzględniają specyficznych polskich znaków].
\W dopasowuje dowolny znak nie wchodzący w skład
słów.
\` dopasowuje pusty łańcuch na początku bufora
(łańcucha).
\' dopasowuje pusty łańcuch na końcu bufora.
Sekwencje specjalne (escape sequences), które są
prawidłowe w stałych łańcuchowych (patrz niżej) są
również poprawne w wyrażeniach regularnych.
Klasy znakw są nową własnością wprowadzoną w standardzie
POSIX. Klasa znaków jest specjalną notacją służącą do
opisu listy znaków posiadających szczególną cechę. Dla
danej klasy rzeczywiście występujące w niej znaki mogą
być różne w zależności od kraju i/lub używanego zestawu
znaków. Na przykład, pojęcie o tym, co jest znakiem
alfabetu jest odmienne w USA niż we Francji.
Klasa znaków dozwolona jest wyłącznie w wyrażeniu
regularnym wewntrz nawiasów klamrowych listy znaków.
Klasy znaków składają się z [:, słowa kluczowego
opisującego klasą, i kończącego :]. POSIX definiuje
następujące klasy znaków:
[:alnum:] Znaki alfanumeryczne.
[:alpha:] Znaki alfabetu.
[:blank:] Znaki spacji lub tabulatorów.
[:cntrl:] Znaki sterujące.
[:digit:] Znaki numeryczne (cyfry).
[:graph:] Znaki, które są zarówno widoczne (przy
wyświetlaniu) jak i drukowalne. (Spacja jest
drukowalna, ale nie jest widoczna, podczas gdy
a jest i takie, i takie.)
[:lower:] Znaki małych liter alfabetu.
[:print:] Znaki drukowalne (znaki, które nie są znakami
sterującymi.)
[:punct:] Znaki interpunkcyjne (nie będące literami,
cyframi, znakami sterującymi ani znakami
spacji).
[:space:] Znaki spacji (takie jak zwykła spacja,
tabulator, wysuw strony, by wymienić tylko
kilka).
[:upper:] Znaki dużych liter alfabetu.
[:xdigit:] Znaki będące cyframi szesnastkowymi.
Na przykład, przed standardem POSIX, by dopasować znaki
alfanumeryczne musiałbyś napisać /[A-Za-z0-9]/. Jeśli
twój zestaw znaków zawiera inne znaki alfabetyczne,
powyższe ich nie dopasuje, a jeśli kolejność znaków w
zestawie jest inna niż w ASCII, to wyrażenie to może
nawet nie dopasowywać znaków alfanumerycznych ASCII. Za
pomocą POSIX-owych klas znaków, możesz napisać
/[[:alnum:]]/, i dopasowuje to wszystkie alfabetyczne i
numeryczne znaki z twojego zestawu znaków.
W listach znaków mogą pojawić się dodatkowe sekwencje
specjalne. Dotyczy to zestawów znaków różnych od ASCII,
które mogą posiadać pojedyncze symbole (zwane elementami
porwnywania - collating elements) reprezentowane przez
więcej niż jeden znak, jak i kilka znaków równoważnych w
operacjach porwnywania, czy sortowania. (np. we
francuskim, zwykłe "e" i akcentowane (grave) e` są
równoważne.)
Symbole porównywania (Collating Symbols)
Symbolem porównywania jest wieloznakowy element
porównywania zawarty pomiędzy [. a .]. Na
przykład, jeśli ch jest elementem porównywania, to
[[.ch.]] jest wyrażeniem regularnym dopasowującym
ten element porównywania, podczas gdy [ch] jest
wyrażeniem regularnym dopasowującym c albo h.
Klasy równoważności (Equivalence Classes)
Klasa równoważności jest specyficzną dla ustawień
lokalnych nazwą dla listy równoważnych sobie
znaków . Nazwa zawarta jest pomiędzy [= a =]. Na
przykład, do reprezentacji wszystkich "e," "`,"
and "`." możne zostać użyta nazwa e. W tym
przypadku, [[=e=]] jest wyrażeniem regularnym
dopasowującym dowolne z e, e', e' lub e`. e`.
Cechy te są bardzo wartościowe w ustawieniach lokalnych
innych niż dla języka angielskiego. Funkcje biblioteczne,
których gawk używa do dopasowywania wyrażeń regularnych
rozpoznają obecnie wyłącznie POSIX-owych klas znaków; nie
rozpoznają one symboli porównywania ani klas
równoważności.
Operatory \y, \B, \<, \>, \w, \W, \` oraz \' są
specyficzne dla gawk; są one rozszerzeniami opartymi na
możliwościach bibliotek wyrażeń regularnych GNU.
Różne opcje wiersza poleceń kontrolują sposób, w jaki
gawk interpretuje znaki w wyrażeniach regularnych.
Brak opcji
W przypadku domyślnym gawk udostępnia wszystkie
możliwości wyrażeń regularnych POSIX oraz powyżej
opisane operatory wyrażeń regularnych GNU. Nie są
jednak obsługiwane wyrażenia powtarzane.
--posix
Obsługiwane są tylko POSIX-owe wyrażenia
regularne, operatory GNU nie mają swego
specjalnego znaczenia. (tj., \w dopasowuje
literał w). Dozwolone są wyrażenia powtarzane.
--traditional
Dopasowywane są wyrażenia regularne tradycyjnego
uniksowego awk. Operatory GNU nie mają swego
specjalnego znaczenia, nie są dostępne ani
wyrażenia powtarzane ani POSIX-owe klasy znaków
([[:alnum:]] i tak dalej). Znaki opisywane przez
ósemkowe lub szesnastkowe sekwencje specjalne są
traktowane dosłownie, nawet jeśli reprezentują one
metaznaki wyrażeń regularnych.
--re-interval
Pozwala na wyrażenia powtarzane, nawet przy użyciu
--traditional.
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 (można użyć również **, oraz **=
dla operatora przypisania).
+ - ! Jednoargumentowy plus, minus i logiczna
negacja.
* / % Mnożenie, dzielenie i modulo (reszta
dzielenia).
+ - Dodawanie i odejmowanie.
odstp Konkatenacja (złączenie) łańcuchów.
< >
<= >=
!= == Regularne operatory relacyjne.
~ !~ Dopasowanie wyrażenia regularnego,
dopasowanie zanegowane. UWAGA: Nie używaj
stałego wyrażenia regularnego (/foo/) po
lewej stronie ~ lub !~. Używaj go tylko po
prawej stronie. Wyrażenie /foo/ ~ exp ma
takie samo znaczenie jak (($0 ~ /foo/) ~
exp). Nie jest to zazwyczaj rzecz, której
oczekujesz.
in Przynależność do tablicy.
&& Koniunkcja logiczna AND.
|| Alternatywa logiczna OR.
?: Wyrażenie warunkowe z C. Ma ono postać wyra1
? wyra2 : wyra3. Jeśli wyra1 jest
prawdziwe, to wartością wyrażenia jest
wyra2, w przeciwnym wypadku jest nią wyra3.
Obliczane jest wyłącznie jedno z wyra2 i
wyra3.
= += -=
*= /= %= ^= 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 (wyra1; wyra2; wyra3) instrukcja
for (var in tablica) instrukcja
break
continue
delete tablica[indeks]
delete tablica
exit [ wyraenie ]
{ instrukcje }
Instrukcje I/O
Instrukcje I/O są następujące:
close(plik [, jak]) Zamyka 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.
getline <plik Ustawia $0 z następnego rekordu
pliku; ustawia NF.
getline var Ustawia var z następnego rekordu
wejściowego; ustawia NF, FNR.
getline var <plik Ustawia var z następnego rekordu
pliku.
polecenie | getline [var]
Uruchamia przesyłanie potokiem
wyjścia polecenia albo do $0, albo
do var, jak wyżej.
polecenie |& getline [var]
Uruchamia polecenia jako proces
współbieżny, wysyłając potokiem
jego wyjście albo do $0 albo do
var, jak wyżej. Procesy
współbieżne są rozszerzeniem gawk.
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. Jeśli osiągnięto
koniec danych wejściowych,
wykonywany jest blok 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 ustawiane na
1 i przetwarzanie rozpoczyna się od
pierwszego wzorca programu AWK.
Jeśli osiągnięty zostanie koniec
danych wejściowych, wykonywany jest
blok END.
print Wypisuje bieżący rekord. Rekord
wyjściowy zakończony jest wartością
zmiennej ORS.
print lista-wyrae Wypisuje wyrażenia. Każde wyrażenie
jest oddzielone wartością zmiennej
OFS. Wyjściowy rekord jest
kończony wartością zmiennej ORS.
print lista-wyrae >plik
Wypisuje wyrażenia do pliku. Każde
wyrażenie jest rozdzielone
wartością zmiennej OFS. Rekord
wyjściowy jest zakończony wartością
zmiennej ORS.
printf fmt, lista-wyrae
Formatuje i wypisuje.
printf fmt, lista-wyrae >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.)
fflush([plik]) Opróżnia bufory związane z otwartym
plikiem wynikowym lub potokiem
plik. Jeśli pominięto plik, to
opróżniane jest standardowe
wyjście. Jeżeli plik jest
łańcuchem pustym, to opróżniane są
bufory wszystkich otwartych plików
i potoków.
Dozwolone są też dodatkowe przekierowania wejścia i
wyjścia dla print i printf.
print ... >> plik
dokleja wyjście do pliku. a przekierowanie
print ... | polecenie
zapisuje do potoku.
print ... |& polecenie
wysyła dane do procesu współbieżnego.
Polecenie getline zwraca zero na końcu pliku, a -1 przy
błędzie. W przypadku błędu, ERRNO zawiera łańcuch
opisujący problem.
UWAGA: używając potoku lub procesu współbieżnego do
getline albo z print czy printf wewnątrz pętli, musisz
użyć close() do utworzenia nowych instancji tego
polecenia. AWK nie zamyka automatycznie potoków ani
procesów współbieżnych gdy zwrócą one EOF.
Instrukcja printf
Wersje AWK instrukcji printf oraz funkcji sprintf()
(patrz niżej) przyjmują następujące formaty konwersji:
%c Znak ASCII. Jeśli argument użyty z %c był
numeryczny, to zostanie potraktowany jak znak do
wypisania. W przeciwnym wypadku, argument będzie
zrozumiany jako łańcuch i zostanie wypisany tylko
pierwszy znak tego łańcucha.
%d, %i liczba dziesiętna (część całkowita).
%e , %E
Liczba zmiennoprzecinkowa w postaci
[-]d.ddddddE[+-]dd. Format %E używa po prostu E
zamiast e.
%f Liczba zmiennoprzecinkowa w postaci
[-]ddd.dddddd.
%g , %G
Używa konwersji e lub f w zależności od tego,
która jest krótsza i pomijając nieznaczące zera.
Format %G używa E zamiast e.
%o Liczba ósemkowa bez znaku (także całkowita).
%u Liczba dziesiętna bez znaku (znów, całkowita).
%s Ciąg znaków (łańcuch).
%x , %X
Liczba szesnastkowa bez znaku (całkowita). Format
%X używa liter ABCDEF zamiast abcdef.
%% Pojedynczy znak %; żaden argument nie jest
konwertowany.
Między % a literą sterującą mogą znaleźć się opcjonalne
parametry dodatkowe:
n$ Oznacza użycie n-tego argumentu w tym miejscu
formatowania. Nosi nazwę specyfikatora
pozycyjnego i jest przeznaczone głównie do użytku
w przetłumaczonych wersjach łańcuchów formatu, nie
w oryginalnym tekście programu AWK. Jest to
rozszerzenie gawk.
- Wyrażenie w swoim polu powinno być wyrównane do
lewej.
spacja W przypadku konwersji numerycznych, poprzedź
wartości dodatnie odstępem, zaś ujemne znakiem
minus.
+ Znak plus, użyty przed modyfikatorem szerokości
(patrz niżej), nakazuje zawsze umieszczać znak
liczby przy konwersjach numerycznych, nawet jeżeli
formatowane dane są dodatnie. Modyfikator +
powoduje unieważnienie modyfikatora spacji.
# Używa "alternatywnej postaci" pewnych liter
sterujących. Dla %o, dodaje początkowe zero. Dla
%x oraz %X dodaje początkowe 0x lub 0X przy
niezerowych wynikach. Dla %e, %E oraz %f wynik
zawsze zawiera kropkę dziesiętną. Dla %g i %G z
wyniku nie są usuwane końcowe zera.
0 Początkowe 0 (zero) działa jako flaga, wskazująca,
że wynik powinien być uzupełniony zerami zamiast
spacji. Odnosi się to nawet do formatów nie-
numerycznych. Flaga ta działa tylko wtedy, gdy
pole jest szersze niż wartość do wypisania.
width (szerokość)
Pole powinno być wypełnione do tej szerokości.
Zwykle pole uzupełniane jest spacjami. Jeśli użyto
flagi 0, to wypełnienie zostanie dokonane przy
użyciu zer.
.prec (dokładność)
Liczba określająca dokładność, jaka ma zostać
użyta przy wypisywaniu. Dla formatów %e, %E i %f,
jest to liczba cyfr, jakie zostaną wypisane po
kropce dziesiętnej. Dla formatów %g i %G określa
maksymalną liczbą cyfr znaczących. Dla formatów
%d, %o, %i, %u, %x oraz %X określa minimalną
liczbę cyfr do wypisania. Dla %s jest to
maksymalna liczba znaków łańcucha, jakie mają
zostać wypisane.
Dynamiczne właściwości width i prec z printf() używanego
w języku C są również wspierane. Znak gwiazdki * w
miejscu specyfikacji zarówno width jak i prec powoduje,
że ich wartości są pobierane z listy argumentów,
przekazywanej printf lub sprintf(). Chcąc użyć
specyfikatora pozycyjnego z dynamiczną szerokością lub
dokładnością należy podać n$ po * w łańcuchu formatu. Na
przykład, "%3$*2$.*1$s".
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:
/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.
Są one szczególnie przydatne do komunikatów o błędach. Na
przykład:
print "Spieprzyłeś to!" > "/dev/stderr"
podczas gdy w przeciwnym wypadku musiałbyś użyć
print "Spieprzyłeś to!" | "cat 1>&2"
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 Plik dla połączenia TCP/IP
na lokalnym porcie lport do
zdalnej maszyny rhost na
zdalnym porcie rport. Użyj
portu 0, jeśli chcesz, by to
system znalazł port.
/inet/udp/lport/rhost/rport Podobne, lecz używa UDP/IP
zamiast TCP/IP.
/inet/raw/lport/rhost/rport Zarezerwowane do przyszłego
użytku.
Inne specjalne nazwy plików zapewniające informacje o
działającym procesie gawk. Te nazwy plików są obecnie
przestarzałe. Do uzyskania informacji, jakie podają,
należy skorzystać z tablicy PROCINFO . Nazwy tych plików
to:
Odczytanie tego pliku zwraca PID bieżącego procesu.
Liczba jest w postaci
dziesiętnej i zakończona jest nową linią.
/dev/ppid Odczytanie tego pliku zwróci PID procesu
rodzicielskiego. Podobnie jak wyżej, liczba
jest dziesiętna i zakończona nową linią.
/dev/pgrpid Odczytanie tego pliku zwróci identyfikator
grupy procesów bieżącego procesu, zapisany w
postaci dziesiętnej i zakończony nową linią.
/dev/user Odczytanie tego pliku zwróci pojedynczy
rekord, zakończony nową linią. Pola są
oddzielone spacjami. $1 jest wartością
wywołania systemowego getuid(2), $2 jest
wartością wywołania systemowego geteuid(2),
$3 jest wartością wywołania systemowego
getgid(2), a $4 jest wartością wywołania
systemowego getegid(2). Jeśli są jeszcze
jakieś dodatkowe pola, to są to
identyfikatory grup, zwrócone przez
getgroups(2). W niektórych systemach może
nie być obsługiwana przynależność do wielu
grup.
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ą z przedziału 0 i 1.
sin(wyra) zwraca sinus z wyra w radianach.
sqrt(wyra) pierwiastek kwadratowy.
srand([wyra])
Używa wyra jako nowego nasionka dla
generatora liczb losowych. Bez podanego
wyra, używany jest czas dnia. Wartość
zwracana to poprzednie nasionko generatora
liczb losowych.
Funkcje łańcuchowe
AWK ma następujące wbudowane funkcje łańcuchowe:
asort(s [, d]) Zwraca liczbę elementów w
źródłowej tablicy s. Zawartość s
jest sortowana z zastosowaniem
zwykłych reguł gawk do
porównywania wartości, zaś
indeksy posortowanych wartości s
azstępowane 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, a indeksy
tablicy źródłowej s pozostają
niezmienione.
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. Użyj \& by
otrzymać literał &. (Musi to być
wpisane jako "\\&". Pełniejsze
omówienie reguł & oraz odwrotnych
ukośników w tekście zastępującym
dla funkcji sub(), gsub() i
gensub() znajdziesz w pozycji
GAWK: Efektywne programowanie w
AWK.)
index(s, t) zwraca indeks łańcucha t w
łańcuchu s, lub zero, jeśli t nie
zostało znalezione.
length(s) zwraca długość łańcucha s lub
długość $0, jeśli nie podano s.
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. Jeśli podano tablicę a, to
jest ona czyszczona a następnie
elementy od 1 do n wypełniane są
fragmentami s pasującymi do
odpowiednich ujętych w nawiasy
podwyrażeń z r. Zerowy element a
zawiera fragment s dopasowany
przez całe wyrażenie regularne r.
split(s, a, r) dzieli łańcuch s na tablicę a 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, tablica a jest
czyszczona. 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
strtonum() przyjmuje, że str jest
liczbą ósemkową. Jeśli str
zaczyna się od początkowego 0x
lub 0X, to strtonum() przyjmuje,
że str jest liczbą szesnastkową.
sub(r, s, t) Podobne do gsub(), lecz
podmieniany jest tylko pierwszy
odpowiadający podłańcuch.
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.
Funkcje czasu
Ponieważ jednym z podstawowych zadań programów AWK jest
przetwarzanie plików z logami, które zawierają informacje
czasowe, gawk udostępnia następujące funkcje,
umożliwiające uzyskiwanie znaczników czasu (timestamps) i
ich formatowanie.
mktime(danedaty)
Zamienia danedaty w znacznik czasu o tej
postaci, co zwracana przez systime(). danedaty
jest łańcuchem postaci YYYY MM DD HH MM SS[
DST]. Zawartością łańcucha jest sześć lub
siedem liczb oznaczających odpowiednio: pełny
rok łącznie ze stuleciem, miesiąc od 1 do 12,
dzień miesiąca od 1 do 31, godzina od 0 do 23,
minuta od 0 do 59, i sekunda od 0 do 60, oraz
opcjonalna flaga zmiany czasu na letni.
Wartości tych liczb nie muszą leżeć w podanych
zakresach. Na przykład, godzina -1 oznacza 1
godziną przed północą. Przyjęto kalendarz
gregoriański zaczynający się od zera, w którym
rok 0 występuje przed rokiem 1, a rok -1 przed
rokiem 0. Zakłąda się, że czas jest podany
według lokalnej strefy czasowej. Jeśli flaga
czasu letniego jest dodatnia, to czas jest
czasem letnim. Jeśli jest zerowa, to
standardowym. Jeśli jest ujemna (domyślne), to
mktime() próbuje ustalić czy dla zadanego czasu
funkcjonuje czas letni. Jeśli danedaty nie
zawierają wystarczającej liczby elementów lub
wyknikowy czas jest poza zakresem, to funkcja
zwraca -1.
strftime(format, timestamp)
formatuje timestamp według wskazówek zawartych
w zmiennej format. timestamp powinien być taki
sam, jak ten, zwracany przez systime(). Jeśli
brakuje parametru timestamp, 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). Zobacz
specyfikację funkcji strftime () w ANSI C, aby
zobaczyć jakie konwersje formatów są na pewno
dostępne. Razem z gawk dostarczana jest wersja
public domain strftime(3) oraz odpowiednia
strona podręcznika man; jeśli ta wersja została
użyta do zbudowania gawk, to wszystkie
konwersje opisane na tej stronie będą dostępne
dla gawk.
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
Począwszy od wersji 3.1 gawk, dostępne są poniższe
funkcje operujące na bitach. Działają przez konwersję
wartości zmiennoprzecinkowych podwójnej precyzji na
całkowite unsigned long, wykonanie operacji, a następnie
konwersję wyniku z powrotem na zmiennoprzecinkowy. Te
funkcje to:
and(v1, v2) Zwraca bitową koniunkcję AND wartości
podanych przez v1 i v2.
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 przez v1 i v2.
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
przez v1 i v2.
Funkcje internacjonalizacji
Począwszy od wersji 3.1 gawk, można używać wewnątrz
programów AWK funkcji do tłumaczenia łańcuchów podczas
wykonania programu. Szczegóły opisano w GAWK: Efektywne
programowanie w AWK.
bindtextdomain(katalog [, domena])
Określa katalog, w którym gawk szuka plików .mo, w
przypadku gdy nie będą lub nie mogą być
umieszczone w ,,standardowych'' miejscach (np.,
podczas testów). 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(acuch [, domena [, kategoria]])
Zwraca tłumaczenie acucha w domenie tekstowej
domena dla kategorii locale kategoria. Domyślną
domen jest bieżąca wartość TEXTDOMAIN. Domyślną
wartością kategorii jest "LC_MESSAGES".
Jeśli podaje się wartość kategorii, to musi to być
łańcuch równy jednej ze znanych kategorii locale
opisanych w GAWK: Efektywne programowanie w AWK.
Trzeba również podać domenę tekstową. Użyj
TEXTDOMAIN, jeśli chcesz korzystać z bieżącej
domeny.
FUNKCJE UŻYTKOWNIKA
Funkcje w AWK są definiowane następująco:
function nazwa(lista parametrw) { 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ść.
Ponieważ funkcje pierwotnie nie były częścią języka AWK,
obsługa zmiennych lokalnych jest trochę niezdarna: Są one
deklarowana 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ąconej białej
spacji. Ma to na celu zapobieżenie niejednoznaczności
składni z operatorem konkatenacji (łączenia).
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.
Zamiast słowa function można używać słowa funct.
DYNAMICZNE ŁADOWANIE NOWYCH FUNKCJI
Począwszy od wersji 3.1 gawk, można dynamicznie dodawać
nowe funkcje wbudowane do pracującego interpretera gawk.
Dokładne szczegóły wykraczają poza zakres tej strony
podręcznika. Można je znaleźć w GAWK: Efektywne
programowanie w AWK.
extension(objekt, funkcja)
Dynamicznie dołącza plik obiektów
współużytkowanych o nazwie objekt, i wywołuje
funkcj z tego obiektu, do wykonania inicjowania.
Obydwa te argumenty powinny być podane jako
łańcuchy. Zwraca wartość zwracaną przez funkcj.
Ta funkcja jest dostarczana i dokumentowana w GAWK:
Efektywne programowanie w AWK, ale wszystko dotyczące tej
cechy może się zmienić w kolejnym wydaniu. SILNIE
zalecamy, byś nie używał tej funkcji do czegoś, czego nie
masz zamiaru robić ponownie.
SYGNAŁY
pgawk przyjmuje dwa sygnały. SIGUSR1 powoduje, że zrzuca
on profil i stos wywołąń funkcji do pliku profilu, którym
jest albo awkprof.out, albo plik podany z opcją
--profile. Następnie kontynuuje działanie. SIGHUP
powoduje, że zrzuca on profil i stos wywołąń funkcji a
następnie kończy pracę.
PRZYKŁADY
Wypisz i posortuj nazwy zgłoszeniowe (login) wszystkich użytkowników:
BEGIN { FS = ":" }
{ print $1 | "sort" }
Zlicz linie w pliku:
{ nlines++ }
END { print nlines }
Poprzedź każdą linię jej numerem w pliku:
{ print FNR, $0 }
Konkatenatuj i numeruj linie (wariacja tematu):
{ print NR, $0 }
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łąsny 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" }'
we Francji może wypisać bonjour, monde.
W tworzeniu i uruchamianiu zlokalizowanego programu AWK
wyróżnia się kilka etapów.
1. Dodanie akcji BEGIN przypisującej wartość zmiennej
TEXTDOMAIN do ustawienia domeny tekstowej na nazwę
skojarzoną z naszym programem.
BEGIN { TEXTDOMAIN = "myprog" }
Umożliwia to gawkowi znalezienie pliku .mo związanego
z programem. Be ztego kroku, gawk używa domeny
tekstowej messages, która prawdopodobnie nie zawiera
tłumaczeń dla naszego programu.
2. Oznakowanie początkowymi znakami podkreślenia
wszystkich łańcuchów, które powinny zostać
przetłumaczone.
3. Jeśli to potrzebne, użycie w programie odpowiednich
funkcji dcgettext() i/lub bindtextdomain().
4. Uruchomienie gawk --gen-po -f myprog.awk > myprog.po
w celu utworzenia pliku .po dla naszego programu.
5. Zapewnienie właściwego tłumaczenia, zbudowanie i
zainstalowanie odpowiedniego pliku .mo.
Funkcje internacjonalizacji opisano szczegółowo w GAWK:
Efektywne programowanie w AWK.
ZGODNOŚĆ Z POSIX
Podstawowym celem gawk była zgodność ze standardem POSIX,
a także zgodność z najnowszymi wersjami UNIX awk. W tym
celu gawk zawiera następujące widzialne dla użytkownika
właściwości, które nie są opisane w książce o AWK, lecz
są częścią awk z Bell Laboratories (Systemu Vr4), a także
są częścią standardu POSIX.
Książka wskazuje, że przypisanie w wierszu poleceń
zachodzi gdy awk w innym wypadku otworzył by argument
jako plik, co następuje po wykonaniu bloku BEGIN. Jednak
we wcześniejszych implementacjach, gdy takie przypisanie
pojawiło się przed jakimikolwiek nazwami plików,
następowało ono przed uruchomieniem bloku BEGIN.
Aplikacje z czasem zaczęły polegać na tej "właściwości".
Gdy awk został zmieniony tak, by odpowiadał dokumentacji,
dodano opcję -v do przypisywania wartości zmiennym przed
wykonaniem programu, aby usatysfakcjonować aplikacje,
które zależały od starego zachowania. (Właściwość ta
została uzgodniona między programistami Bell Laboratories
i GNU).
Opcja -W, przeznaczona dla właściwości zależnych od
implementacji należy do standardu POSIX.
Podczas przetwarzania argumentów, gawk używa specjalnej
opcji "--", sygnalizującej koniec argumentów. W trybie
zgodności będzie ostrzegał, lecz poza tym ignorował opcje
niezdefiniowane. W normalnym trybie działania, argumenty
takie są przekazywane do programu AWK, aby je
przetworzył.
Książka o AWK nie definiuje wartości zwracanej przez
srand(). Wersja SVr4 UNIX awk (oraz standard POSIX)
zwracają wartość poprzedniego używanego nasionka,
umożliwiając śledzenie kolejnych sekwencji liczb
losowych. Dlatego srand() w gawk również zwraca
poprzednio używane nasionko.
Innymi nowymi właściwościami są: używanie wielu opcji -f
(z MKS awk), tablica ENVIRON, sekwencje specjalne \a oraz
\v (opracowane oryginalnie w gawk i przeniesione z
powrotem do wersji Bell Laboratories); funkcje wbudowane
tolower() i toupper() (z Bell Laboratories) oraz
specyfikacje konwersji ANSI C w printf (zrobione
pierwotnie w wersji Bell Laboratories).
WŁAŚCIWOŚCI HISTORYCZNE
Istnieją dwie historyczne właściwości AWK, obsługiwane
przez gawk. Po pierwsze, możliwe jest wywołanie funkcji
wbudowanej length() nie tylko bez argumentów, ale również
bez nawiasów! Tak więc
a = length # Święty Algol 60, Batman!
oznacza to samo co jedno z poniższych
a = length()
a = length($0)
Właściwość ta jest oznaczona jako "nieaprobowana" w
standardzie POSIX i gawk wypisuje ostrzeżenie o jej
użyciu, o ile podano w wierszu poleceń opcję -W lint.
Inną właściwością jest używanie instrukcji continue lub
break poza ciałami pętli while, for lub do. Tradycyjne
implementacje AWK traktowały takie użycie jako
równoważnik instrukcji next. Gawk realizuje ten sposób
użycia, jeśli podano opcję --traditional.
ROZSZERZENIA GNU
Gawk ma kilka rozszerzeń w stosunku do POSIX awk. Są one
opisane w tej sekcji. Wszystkie rozszerzenia, które są tu
opisane można wyłączyć, wywołując gawk z opcją
--traditional.
Następujące właściwości gawk nie są dostępne w wersjach
POSIX awk.
o Dla plików podanych opcją -f nie jest wykonywane
przeszukiwanie ścieżki. option. Dlatego też, zmienna
środowiskowa AWKPATH nie jest zmienną specjalną.
o Sekwencja specjalna \x (Wyłączana przez --posix.)
o Funkcja fflush() (Wyłączana przez --posix.)
o Możliwość kontynuowania linii po ? i :. (Wyłączana
przez --posix.)
o Stałe ósemkowe i szesnastkowe w programach AWK.
o Zmienne ARGIND, BINMODE, ERRNO, LINT, RT i TEXTDOMAIN
nie są specjalne.
o Zmienna IGNORECASE oraz jej efekty uboczne nie są
dostępne.
o Zmienna FIELDWIDTHS oraz rozdzielanie o ustalonej
szerokości pola.
o Nie jest dostępna tablica PROCINFO
o Posługiwanie się RS jako wyrażeniem regularnym.
o Nie są rozpoznawane specjalne nazwy plików dostępne do
przeadresowań I/O.
o Operator |& do tworzenia procesów współbieżnych.
o Możliwość wydzielania pojedynczych znaków przy użyciu
łańcucha pustego jako wartości FS oraz jako trzeciego
argumentu funkcji split().
o Użycie delete array do kasowania całej zawartości
tablicy.
o Użycie nextfile do porzucenia przetwarzania bieżącego
pliku wejściowego.
o Opcjonalny drugi argument funkcji close().
o Opcjonalny trzeci argument funkcji match().
o Możliwość użycia specyfikatorów pozycyjnych w printf i
sprintf().
Funkcje
and(), asort(), bindtextdomain(), compl(), dcgettext(),
gensub(), lshift(), mktime(), or(), rshift(),
strftime(), strtonum(), systime() i xor(). ! .
o Lokalizowalne łańcuchy.
o Dynamiczne dodawanie nowych funkcji wbudowanych,
funkcją extension().
Książka o AWK nie definiuje wartości zwracanej przez
funkcję close(). Zaimplementowana w Gawk funkcja close()
zwraca wartość z fclose(3) lub pclose(3), zależnie czy
zamykano plik czy potok. Zwraca kod zakończenia procesu
przy zamykaniu potoku wejściowego. Wartością zwracaną
jest -1 jeśli dany plik, potok czy proces współbieżny nie
były otwarte za pomocą przekierowania.
Gdy gawk jest wywołany z opcją --traditional, jeśli
argumentem fs opcji -F jest "t", to FS jest ustawiane na
znak tabulacji. Zauważ, że wpisanie gawk -F\t ...
powoduje po prostu zacytowanie przez powłokę znaku "t" i
nie przesyła "\t" do opcji -F. Ponieważ jest to raczej
brzydki przypadek specjalny, nie jest to zachowanie
domyślne. Zachowanie to nie pojawia się również po
podaniu opcji -W posix. Aby faktycznie uzyskać znak
tabulacji jako separator pól, najlepiej posłużyć się
apostrofami jako znakami cytowania: gawk -F'\t' ....
ZMIENNE ŚRODOWISKOWE
Do podania listy katalogów przeglądanych przez gawk
podczas poszukiwania plików zadanych opcjami -f i --file
można posłużyć się zmienną środowiskową AWKPATH.
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.
ZOBACZ TAKŻE
egrep(1), getpid(2), getppid(2), getpgrp(2), getuid(2),
geteuid(2), getgid(2), getegid(2), getgroups(2)
The AWK Programming Language, Alfred V. Aho, Brian W.
Kernighan, Peter J. Weinberger, Addison-Wesley, 1988.
ISBN 0-201-07981-X.
GAWK: Efektywne programowanie w AWK, Edition 3.0,
opublikowana przez Free Software Foundation, 2001.
[od tłum.: powyższa publikacja dostarczana jest razem z
opisywaną wersją programu]
BŁĘDY
Opcja -F niekoniecznie ma właściwość przypisywania
zmiennych; pozostaje tylko dla zgodności wstecznej.
Niepoprawne składniowo programy z pojedynczego znaku mogą
powodować przepełnienie stosu analizatora, dając niezbyt
pomocny komunikat. Programy takie są zaskakująco trudne
do do analizy w całkiem ogólnym przypadku, a wysiłek, by
to jednak robić nie jest tego wart.
AUTORZY
Oryginalna wersja UNIX awk była opracowana i
zaimplementowana przez Alfreda Aho, Petera Weinbergera i
Briana Kernighana z Bell Laboratories. Brian Kernighan
wciąż pracuje nad nią i rozszerza ją.
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.
Pierwotny port pod DOS został dokonany przez Conrada
Kwoka i Scotta Garfinkle. Scott Deifik jest obecnym
opiekunem wersji DOS. Pat Rankin zrobił port na VMS, a
Michal Jaegermann zrobił port na Atari ST. Port na OS/2
został zrobiony przez Kai Uwe Rommela, przy udziale i
pomocy Darrela Hankersona. Fred Fish zapewnił obsługę dla
Amigi, Stephen Davies przeniesienie na Tandem, a Martin
Brown na BeOS.
INFORMACJA O WERSJI
Ta strona podręcznika man opisuje gawk, w wersji numer
3.1.0.
RAPORTY O BŁĘDACH
Jeśli znajdziesz w gawk błąd, proszę o przesłanie listu
pocztą elektroniczną na adres bug-gnu-utils@gnu.org, z
kopią (carbon copy) na arnold@gnu.org. Proszę o
załączenie wersji systemu operacyjnego, wersji gawk
(otrzymanej z gawk --version), wersji kompilatora C,
którym została skompilowana, oraz możliwie małego
programu testowego i danych, które umożliwiają
powtórzenie problemu.
Przed wysłaniem raportu o błędzie, zrób dwie rzeczy.
Najpierw sprawdź, czy masz najnowszą wersję gawk. Wiele
błędów (zwykle subtelnych) jest poprawianych w każdej
nowej wersji i jeśli twoja wersja jest przedawniona, to
być może problem jest już rozwiązany. Po drugie, proszę,
przeczytaj uważnie tę stronę podręcznika man oraz
podręczniki, aby się upewnić, że to, co uważasz za błąd,
jest nim naprawdę, a nie tylko dziwactwem w konstrukcji
języka.
Cokolwiek zrobisz, NIE wysyłaj zgłoszenia błędu na grupę
dyskusyjną comp.lang.awk. Mimo, że opiekunowie projektu
gawk czasami czytają tę grupę, wysyłanie na nią zgłoszeń
jest drogą niepewną. Proszę, użyj zamiast tego podanych
wyżej adresów poczty elektronicznej.
PODZIĘKOWANIA
Brian Kernighan z Bell Laboratories dał wartościowe
wsparcie podczas testowania i debuggowania. Dziękujemy.
KOPIOWANIE NINIEJSZEJ DOKUMENTACJI
[Sekcja nietłumaczona z uwagi na ograniczenie zawarte w
ostatnim akapicie]
Copyright (C) 1989, 1991-2001 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.