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

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

 


 

A. Podsumowanie gawk

Ten dodatek zawiera krótkie podsumowanie wiersza poleceń gawk i języka awk. Ma zadanie służyć jako "skrócona instrukcja". Z tego powodu jest zwięzły, ale kompletny.

A.1. Podsumowanie opcji wiersza poleceń

Wiersz poleceń składa się z opcji przeznaczonych dla samego gawk, tekstu programu awk (jeśli nie podano go przez opcję `-f') i wartości, jakie mają być udostępnione w predefiniowanych zmiennych ARGC i ARGV:

gawk [opcje w stylu POSIX lub GNU] -f plik-źródł [--] plik ...
gawk [opcje w stylu POSIX lub GNU] [--] 'program' plik ...

Opcje, które akceptuje gawk:

-F sp
--field-separator sp
Wykorzystuje sp jako separator pól (wartość predefiniowanej zmiennej FS).
-f plik-programu
--file plik-programu
Czyta program źródłowy awk z pliku plik-programu, zamiast z pierwszego argumentu wiersza poleceń.
-mf NNN
-mr NNN
Flaga `f' ustala maksymalną liczbę pól, a `r' maksymalny rozmiar rekordu. Opcje te są ignorowane przez gawk, gdyż gawk nie ma predefiniowanych ograniczeń. Występują one tylko dla zachowania zgodności z wersją awk z Bell Labs research.
-v zmn=wart
--assign zmn=wart
Przed rozpoczęciem wykonywania programu przypisuje zmiennej zmn wartość wart.
-W traditional
-W compat
--traditional
--compat
Stosuje tryb zgodności, w którym rozszerzenia gawk są wyłączone.
-W copyleft
-W copyright
--copyleft
--copyright
Wypisuje na standardowym wyjściu krótką wersję Powszechnej Licencji Publicznej (GPL) i kończy pracę. Opcja ta może zniknąć w kolejnych wersjach gawk.
-W help
-W usage
--help
--usage
Wypisuje na standardowym wyjściu stosunkowo krótkie podsumowanie dostępnych opcji i kończy pracę.
-W lint
--lint
Daje ostrzeżenia o podejrzanych lub nieprzenośnych konstrukcjach awk.
-W lint-old
--lint-old
Ostrzega o konstrukcjach niedostępnych w pierwotnej wersji awk z Version 7 Unix.
-W posix
--posix
Stosuje tryb zgodności z POSIX, w którym wyłączone są rozszerzenia gawk i wprowadzone są dodatkowe ograniczenia.
-W re-interval
--re-interval
Zezwala na wyrażenia przedziałowe (zob. 4.3. Operatory wyrażeń regularnych), w wyrażeniach regularnych.
-W source=tekst-programu
--source tekst-programu
Wykorzystuje tekst-programu jako kod źródłowy programu awk. Pozwala na przeplatanie kodu źródłowego z wiersza poleceń z kodem źródłowym z plików i jest szczególnie przydatna do używania programów z wiersza poleceń z funkcjami bibliotecznymi.
-W version
--version
Wypisuje na standardowym wyjściu błędów informacje o tym konkretnym egzemplarzu gawk.
--
Sygnalizuje koniec opcji. Przydatna, gdy chce się zezwolić, by kolejne argumenty samego programu awk zaczynały się od `-'. Występuje głównie dla spójności z występującymi w POSIX konwencjami analizy składniowej argumentów.

Wszelkie inne opcje są zaznaczane jako nieprawidłowe, lecz poza tym są ignorowane. Zob. 14.1. Opcje wiersza poleceń, gdzie podano szczegóły.

A.2. Podsumowanie języka

Program awk składa się z ciągu zera lub więcej instrukcji wzorzec-akcja i opcjonalnych definicji funkcji. Albo wzorzec albo akcję można pominąć.

wzorzec    { instrukcje akcji }

wzorzec
          { instrukcje akcji }

function nazwa(lista parametrów)   { instrukcje akcji }

gawk najpierw czyta źródło programu z pliku-programu (plików), jeśli takowe podano, lub z pierwszego nie będącego opcją argumentu w wierszu poleceń. Opcji `-f' w wierszu poleceń można użyć wielokrotnie. gawk czyta tekst programu ze wszystkich plików plik-programu, w praktyce sklejając je w kolejności, w jakiej je podano. Przydaje się to przy konstruowaniu bibliotek funkcji awk, bez konieczności wpisywania ich w każdy nowy program awk, jaki z nich korzysta. Chcąc w programie wpisanym w wierszu poleceń wykorzystać funkcję biblioteczną z pliku, należy podać `--source 'program'', a program wpisać między pojedynczymi cudzysłowami. Zob. 14.1. Opcje wiersza poleceń.

Ścieżkę wyszukiwania używaną przy szukaniu plików źródłowych wskazanych opcją `-f' określa zmienna środowiska AWKPATH. Gdy nie ustawiono AWKPATH, wykorzystywana jest domyślna ścieżka, `.:/usr/local/share/awk'(30). Jeśli nazwa pliku podana opcji `-f' zawiera znak `/', to nie jest przeprowadzane wyszukiwanie. Zob. 14.3. Zmienna środowiska AWKPATH.

gawk kompiluje program do postaci wewnętrznej, a następnie przechodzi do odczytu plików wymienionych w tablicy ARGV. Początkowe wartości ARGV pochodzą od argumentów wiersza poleceń. Jeżeli w wierszu poleceń nie podano plików, gawk czyta standardowe wejście.

Jeśli "plik" wskazany w wierszu poleceń ma postać `zmn=wart', to jest traktowany jak przypisanie do zmiennej: zmiennej zmn przypisywana jest wartość wart. Jeśli któryś z plików ma wartość będącą łańcuchem pustym, to ten element listy jest pomijany.

gawk sprawdza dla każdego rekordu wejścia, czy pasuje on do jakiegoś wzorca w programie awk. Dla każdego wzorca, do którego pasuje rekord, wykonywana jest skojarzona z nim akcja.

A.3. Zmienne i pola

Zmienne awk nie są deklarowane: pojawiają się przy pierwszym użyciu. Ich wartości są albo liczbami zmiennoprzecinkowymi albo łańcuchami. awk posiada także jednowymiarowe tablice; możliwe jest symulowanie tablic wielowymiarowych. Istnieje kilkanaście predefiniowanych zmiennych, inicjowanych przez awk przy uruchamianiu programu. Zestawiono je poniżej.

A.3.1. Pola

W czasie odczytu każdego wiersza wejściowego gawk dzieli go na pola, jako separator pól wykorzystując wartość zmiennej FS. Jeżeli FS jest pojedynczym znakiem, pola oddzielane są przez ten znak. W przeciwnym wypadku, oczekuje się, że FS będzie pełnym wyrażeniem regularnym. W przypadku szczególnym, gdy FS jest pojedynczą spacją, pola oddzielane są ciągami spacji, tabulacji i/lub znaków nowej linii.(31) Jeżeli FS jest łańcuchem pustym (""), to każdy pojedynczy znak rekordu staje się osobnym polem. Należy zwrócić uwagę na to, że wartość IGNORECASE (zob. 4.5. Uwzględnianie wielkości liter w dopasowaniach) wpływa również na sposób podziału pól gdy FS jest wyrażeniem regularnym.

Do pola wiersza wejściowego odwołujemy się przez jego pozycję, $1, $2, i tak dalej. $0 to cały wiersz. Polu można też przypisać nową wartość. Numery pól nie muszą być stałymi:

n = 5
print $n

wypisuje piąte pole wiersza wejściowego. Zmiennej NF przypisywana jest całkowita liczba pól w wierszu wejściowym.

Odwołania do nie istniejących pól (tj. pól po $NF) zwracają łańcuch pusty. Jednak przypisanie do nie istniejącego pola (np., $(NF+2) = 5) zwiększa wartość NF, tworzy ewentualne pola pośrednie z łańcuchem pustym jako wartością i powoduje przeliczenie wartości $0, za pomocą pól rozdzielanych wartością OFS. Zmniejszenie NF powoduje utratę wartości pól za nową wartością i przeliczenie $0, za pomocą pól oddzielanych przez OFS. Zob. 5. Czytanie plików wejściowych.

A.3.2. Zmienne wbudowane

Zmienne wbudowane gawk:

ARGC
Liczba elementów ARGV. Poniżej podano, co faktycznie wchodzi do ARGV.
ARGIND
Indeks w ARGV aktualnie przetwarzanego pliku. Gdy gawk przetwarza wejściowe pliki danych, zawsze prawdziwe jest `FILENAME == ARGV[ARGIND]'.
ARGV
Tablica argumentów wiersza poleceń. Tablica indeksowana jest od zera do ARGC - 1. Dzięki dynamicznym zmianom ARGC i zawartości ARGV można sterować plikami wykorzystywanymi jako źródło danych. Pusty element w ARGV jest ignorowany. ARGV nie zawiera opcji awk ani tekstu samego programu awk.
CONVFMT
Format konwersji używany przy przekształcaniu liczb na łańcuchy.
FIELDWIDTHS
Lista rozdzielonych spacjami liczb opisujących dane wejściowe o stałej szerokości.
ENVIRON
Tablica wartości zmiennych środowiska. Indeksowana nazwami zmiennych, każdy element jest wartością odpowiedniej zmiennej. Zatem, dla zmiennej środowiska HOME mamy ENVIRON["HOME"]. Może mieć wartość np. `/home/arnold'. Zmiana tej tablicy nie wpływa na środowisko widziane przez programy uruchamiane przez gawk za pośrednictwem przekierowań lub funkcji system. (Może się to zmienić w przyszłych wersjach gawk.) Niektóre systemy operacyjne nie posiadają zmiennych środowiska. Przy pracy w tych systemach tablica ENVIRON jest pusta.
ERRNO
Systemowy komunikat o błędzie gdy przy korzystaniu z getline lub close pojawi się błąd.
FILENAME
Nazwa bieżącego pliku wejściowego. Jeżeli w wierszu poleceń nie podano żadnego pliku, wartością FILENAME jest łańcuch pusty.
FNR
Numer rekordu wejściowego w bieżącym pliku wejściowym.
FS
Separator pól wejściowych, domyślnie spacja.
IGNORECASE
Flaga rozróżniania wielkości liter w porównywaniach łańcuchów i działaniach na wyrażeniach regularnych. Jeżeli IGNORECASE ma wartość niezerową, to dopasowywanie wzorców w regułach, podział na rekordy za pomocą RS, podział na pola za pomocą FS, dopasowywanie wyrażeń regularnych za pomocą `~' i `!~' oraz funkcje wbudowane gensub, gsub, index, match, split i sub ignorują różnice w wielkości liter podczas wykonywania działań na wyrażeniach regularnych. Ignorowana jest też wielkość liter przy porównywaniu łańcuchów. Wartość IGNORECASE nie wpływa na indeksowanie tablic.
NF
Liczba pól w bieżącym rekordzie wejściowym.
NR
Całkowita liczba przeglądniętych do tej pory rekordów wejściowych.
OFMT
Format wyjściowy w instrukcji print, domyślnie "%.6g".
OFS
Separator pól wyjściowych, domyślnie spacja.
ORS
Separator rekordów wyjściowych, domyślnie znak nowej linii.
RS
Separator rekordów wejściowych, domyślnie znak nowej linii. Jeżeli RS przypisano łańcuch pusty, to rekordy oddzielane są pustymi wierszami. Gdy RS jest łańcuchem pustym, to znak nowej linii zawsze działa jako separator pól, oprócz podziału wyznaczanego wartością FS. Jeżeli RS jest łańcuchem wieloznakowym, to oznacza wyrażenie regularne; rekordy rozdzielane są przez tekst pasujący do danego wyrażenia regularnego.
RT
Tekst wejściowy, który pasował do tekstu określonego przez RS, separator rekordów.
RSTART
Indeks pierwszego znaku ostatniego dopasowania wykonanego przez match; zero jeśli brak dopasowań.
RLENGTH
Długość ostatnio dopasowanego przez match łańcucha; -1 jeśli brak dopasowań.
SUBSEP
Łańcuch używany do oddzielania wielu indeksów w elemencie tablicy, domyślnie "\034".

Zob. 10. Zmienne wbudowane, gdzie podano szczegóły.

A.3.3. Tablice

Tablice indeksowane są za pomocą wyrażenia w nawiasach kwadratowych (`[' i `]'). Indeksy tablicy są zawsze łańcuchami: w razie potrzeby liczby są przekształcane na łańcuchy, zgodnie ze standardowymi regułami konwersji (zob. 7.4. Konwersja łańcuchów i liczb).

Przy stosowaniu wewnątrz nawiasów kwadratowych kilku wyrażeń oddzielonych przecinkami indeks tablicy jest łańcuchem powstałym przez złączenie wartości poszczególnych, zamienionych na łańcuchy, indeksów, oddzielonych separatorem indeksów (wartością SUBSEP).

W kontekście warunkowym do sprawdzenia, czy w tablicy jest indeks o zadanej wartości, można użyć specjalnego operatora in.

if (wart in tabl)
        print tabl[wart]

Jeżeli tablica jest wieloindeksowa, do testowania istnienia elementu wykorzystujemy `(i, j, ...)'.

Konstrukcję in można też stosować w pętli for, do przechodzenia kolejno przez wszystkie elementy tablicy. Zob. 11.5. Przeglądanie wszystkich elementów tablicy.

Element tablicy usuwa się za pomocą instrukcji delete.

Całą tablicę czyścimy za pomocą `delete tablica'.

Zob. 11. Tablice w awk.

A.3.4. Typy danych

Wartością wyrażenia awk jest zawsze albo liczba albo łańcuch.

Niektóre konteksty (jak np. przy operatorach arytmetycznych) wymagają wartości numerycznych. Przekształcają one łańcuchy na liczby przez interpretację tekstu łańcucha jako liczby. Jeżeli łańcuch nie wygląda jak liczba, to jest przekształcany na zero.

W innych kontekstach (jak przy konkatenacji) wymagane są wartości łańcuchowe. Liczby są wówczas zamieniane na łańcuchy, praktycznie poprzez wypisanie ich przez sprintf. Zob. 7.4. Konwersja łańcuchów i liczb, gdzie podano szczegóły.

W celu wymuszenia konwersji wartości łańcuchowej na liczbę wystarczy po prostu dodać do niej zero. Jeżeli wartość, od jakiej zaczynamy jest już liczbą, nie zmieni jej to.

W celu wymuszenia konwersji wartości numerycznej na łańcuch należy skleić ją z łańcuchem pustym.

Porównywania dokonywane są numerycznie jeśli oba operandy są numeryczne lub jeśli jeden jest liczbą a drugi łańcuchem liczbowym. W przeciwnym razie jeden lub oba operandy przekształcane są na łańcuchy i wykonywane jest porównywanie znakowe. Pola, wejście getline, FILENAME, elementy ARGV, elementy ENVIRON i elementy tablicy utworzonej przez split są jedynymi elementami, które mogą być łańcuchami liczbowymi. Stałe łańcuchowe, jak "3.1415927" nie są łańcuchami liczbowymi, są stałymi łańcuchowymi. Pełne zasady porównań opisano w 7.10. Typy zmiennych i wyrażenia porównania.

Niezainicjowane zmienne mają wartość łańcuchową "" (łańcuch pusty, zerowy). W kontekstach, w których wymagana jest liczba, jest to równoważne zeru.

Zob. 7.3. Zmienne, gdzie szerzej opisano nazywanie i inicjowanie zmiennych; zob. 7.4. Konwersja łańcuchów i liczb, gdzie szerzej opisano, jak interpretowane są wartości zmiennych.

A.4. Wzorce

Program awk w większości złożony jest z reguł, z których każda składa się ze wzorca i następującej po nim akcji. Akcja objęta jest znakami `{' i `}'. Można pominąć wzorzec albo akcję, ale nie oba równocześnie. Jeśli pominięto wzorzec, akcja wykonywana jest dla każdego rekordu wejściowego. Pominięta akcja jest równoważna `{ print }', co wypisuje cały wiersz.

Komentarze zaczynają się znakiem `#' i rozciągają się do końca wiersza. Do oddzielania instrukcji można stosować puste wiersze. Instrukcje normalnie kończą się znakiem nowej linii. Nie obowiązuje to jednak dla wierszy, na końcu których występują `,', `{', `?', `:', `&&' lub `||'. Instrukcje wierszy kończących się na do lub else również są automatycznie kontynuowane w następnym wierszu. W pozostałych przypadkach wiersz można kontynuować kończąc go znakiem `\'; wówczas znak nowej linii jest ignorowany.

W jednym wierszu można umieścić kilka instrukcji oddzielając je od siebie średnikiem `;'. Odnosi się to zarówno do instrukcji wewnątrz części reguły definiującej akcję (zwykły przypadek), jak i do instrukcji reguł.

Zob. 2.2.5. Komentarze w programach awk, gdzie opisano konwencję komentarzy w awk;

zob. 2.6. Instrukcje awk a wiersze, gdzie podano opis mechanizmu kontynuacji linii w awk.

A.4.1. Podsumowanie wzorców

Wzorzec awk może być jednym z poniższych:

/wyrażenie regularne/

wyrażenie relacyjne
wzorzec && wzorzec
wzorzec || wzorzec
wzorzec ? wzorzec : wzorzec

(wzorzec)
! wzorzec
wzorzec1, wzorzec2
BEGIN
END

BEGIN i END to dwa specjalne rodzaje wzorców, z którymi nie jest porównywane wejście. Akcje wszystkich reguł BEGIN są łączone tak, jakby wszystkie ich instrukcje zapisano w pojedynczej regule BEGIN. Są one wykonywane przed rozpoczęciem odczytu wejścia. Podobnie sklejane są wszystkie reguły END. Wykonywane są po wyczerpaniu całości wejścia (lub gdy wykonywana jest instrukcja exit). Wzorce BEGIN i END nie mogą być łączone z innymi wzorcami w pokazanych wyżej wyrażeniach wzorca. Dla BEGIN i END nie można pominąć akcji.

Przy wzorcu /wyrażenie-regularne/ skojarzona z nim instrukcja wykonywana jest dla każdego rekordu wejściowego pasującego do danego wyrażenia regularnego. Wyrażenia regularne podsumowano poniżej.

wyrażenie relacyjne może wykorzystywać dowolny z operatorów zdefiniowanych poniżej w sekcji o akcjach. Ogólnie mówiąc, sprawdza, czy pewne pola pasują do pewnych wyrażeń regularnych.

Operatory `&&', `||' i `!' są odpowiednio logicznym "and", "or" i "not", jak w C. Wykonują skrócone wyznaczanie wartości, również jak w C, i są stosowane do łączenia prostszych wyrażeń wzorców. Jak w większości języków, do zmiany kolejności obliczeń można użyć nawiasów.

Operator `?:' jest taki sam jak w C. Jeżeli pasuje pierwszy wzorzec, to rekord wejściowy dopasowywany jest do drugiego wzorca; w przeciwnym razie, do trzeciego. Dopasowanie jest wykonywane albo do drugiego albo do trzeciego wzorca.

Postać `wzorzec1, wzorzec2' wzorca zwana jest wzorcem zakresu. Dopasowuje wszystkie wiersze wejściowe począwszy od wiersza pasującego do wzorzec1 aż do wiersza pasującego do wzorzec2 włącznie. Wzorzec zakresu nie może być używany jako operand jakiegokolwiek operatora wzorców.

Zob. 8.1. Elementy wzorców.

A.4.2. Wyrażenia regularne

Wyrażenia regularne oparto na POSIX-owych EREs (extended regular expressions -- rozszerzonych wyrażeniach regularnych). Sekwencje specjalne dozwolone w stałych łańcuchowych są również poprawne w wyrażeniach regularnych (zob. 4.2. Sekwencje specjalne). Wyrażenia regularne złożone są ze znaków w następujący sposób:

c
dopasowuje znak c (zakładając, że c nie jest żadnym ze znaków wymienionych niżej).
\c
dopasowuje dosłowny znak c.
.
dopasowuje dowolny znak, łącznie ze znakiem nowej linii. W trybie ścisłej zgodności z POSIX `.' nie dopasowuje znaku NUL, czyli znaku o wszystkich bitach równych zero.
^
dopasowuje początek łańcucha.
$
dopasowuje koniec łańcucha.
[abc...]
dopasowuje dowolny ze znaków abc... (lista znaków).
[[:klasa:]]
dopasowuje dowolny znak z klasy znaków klasa. Dostępnymi klasami są alnum, alpha, blank, cntrl, digit, graph, lower, print, punct, space, upper i xdigit.
[[.symbol.]]
dopasowuje wieloznakowy symbol porządkowania leksykograficznego symbol. gawk nie obsługuje obecnie symboli porządkowania (collating symbols).
[[=nazwaklasy=]]
dopasowuje dowolny z równoważnych znaków z bieżącego ustawienia locale, wskazanego klasą równoważności nazwaklasy. gawk nie obsługuje obecnie klas równoważności.
[^abc...]
dopasowuje dowolny znak oprócz abc... (dopełniająca lista znaków).
r1|r2
dopasowuje r1 lub r2 (alternatywa).
r1r2
dopasowuje r1, a następnie r2 (złączenie).
r+
dopasowuje jeden lub więcej r.
r*
dopasowuje zero lub więcej r.
r?
dopasowuje zero lub jeden r.
(r)
dopasowuje r (grupowanie).
r{n}
r{n,}
r{n,m}
dopasowuje co najmniej n, n lub więcej, albo n do m wystąpień r (wyrażenia przedziałowe).
\y
dopasowuje łańcuch pusty albo na początku albo na końcu słowa.
\B
dopasowuje łańcuch pusty 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 ze znaków tworzących wyrazy (znaki alfanumeryczne i znak podkreślenia).
\W
dopasowuje dowolny znak nie będący znakiem współtworzącym słowa.
\`
dopasowuje łańcuch pusty na początku bufora (w gawk to samo, co łańcuch).
\'
dopasowuje łańcuch pusty na końcu bufora.

O tym, jak gawk interpretuje znaki w wyrażeniach regularnych, decydują rozmaite opcje wiersza poleceń.

bez opcji
W przypadku domyślnym gawk udostępnia wszystkie udogodnienia POSIX-owych wyrażeń regularnych i operatorów GNU opisane powyżej. Jednak wyrażenia przedziałowe nie są obsługiwane.
--posix
Obsługiwane są tylko wyrażenia regularne POSIX, operatory GNU nie mają specjalnego znaczenia (np., `\w' dopasowuje dosłowne `w'). Wyrażenia przedziałowe są dozwolone.
--traditional
Dopasowywane są wyrażenia regularne tradycyjnego uniksowego awk. Operatory GNU nie mają znaczenia specjalnego, nie są dostępne wyrażenia przedziałowe ani POSIX-owe klasy znaków ([[:alnum:]] i tak dalej). Znaki opisane ósemkowymi i szesnastkowymi sekwencjami specjalnymi traktowane są dosłownie, nawet jeśli reprezentują metaznaki wyrażeń regularnych.
--re-interval
Dopuszcza wyrażenia przedziałowe w wyrażeniach regularnych, nawet jeśli podano `--traditional'.

Zob. 4. Wyrażenia regularne.

A.5. Akcje

Instrukcje akcji objęte są nawiasami klamrowymi `{' i `}'. Pominięta akcja jest równoważna `{ print }'.

Instrukcje akcji składają się z typowych instrukcji: przypisania, instrukcji warunkowych i pętli, jakie można znaleźć w większości języków. Dostępne operatory, instrukcje sterujące i instrukcje wejścia/wyjścia są podobne do występujących w C.

Komentarze zaczynają się znakiem `#' i rozciągają się do końca wiersza. Do oddzielania instrukcji można stosować puste wiersze. Instrukcje normalnie kończą się znakiem nowej linii. Nie obowiązuje to jednak dla wierszy, na końcu których występują `,', `{', `?', `:', `&&' lub `||'. Instrukcje wierszy kończących się na do lub else również są automatycznie kontynuowane w następnym wierszu. W pozostałych przypadkach wiersz można kontynuować kończąc go znakiem `\'; wówczas znak nowej linii jest ignorowany.

W jednym wierszu można umieścić kilka instrukcji oddzielając je od siebie średnikiem `;'. Odnosi się to zarówno do instrukcji wewnątrz części reguły definiującej akcję (zwykły przypadek), jak i do instrukcji reguł.

Zob. 2.2.5. Komentarze w programach awk, gdzie opisano konwencję komentarzy w awk;

zob. 2.6. Instrukcje awk a wiersze, gdzie podano opis mechanizmu kontynuacji linii w awk.

A.5.1. Operatory

Operatory w awk, w kolejności malejącego priorytetu:

(...)
Grupowanie.
$
Odwołanie do pola.
++ --
Inkrementacja i dekrementacja, zarówno przedrostkowa jak i przyrostkowa.
^
Potęgowanie (można też używać `**', a `**=' do operatora przypisania, ale nie są one wymienione w standardzie POSIX).
+ - !
Jednoargumentowy plus, jednoargumentowy minus i negacja logiczna.
* / %
Mnożenie, dzielenie, reszta z dzielenia (modulo).
+ -
Dodawanie i odejmowanie.
space
Konkatenacja łańcuchów.
< <= > >= != ==
Zwyczajowe operatory relacyjne.
~ !~
Dopasowanie wyrażenia regularnego, zaprzeczone dopasowanie.
in
Przynależność do tablicy.
&&
Koniunkcja logiczna ("and").
||
Alternatywa logiczna ("or").
?:
Wyrażenie warunkowe. Ma postać `wyr1 ? wyr2 : wyr3'. Jeżeli wyr1 jest prawdziwe, to wartością wyrażenia jest wyr2, w przeciwnym razie wyr3. Obliczane jest tylko jedno spośród wyr2 i wyr3.
= += -= *= /= %= ^=
Przypisanie. Obsługiwane jest zarówno przypisanie bezpośrednie (zmn=wartość) jak i przypisanie operatorowe (pozostałe formy).

Zob. 7. Wyrażenia.

A.5.2. Instrukcje sterujące

Mamy następujące instrukcje sterujące:

if (warunek) instrukcja [ else instrukcja ]
while (warunek) instrukcja

do instrukcja while (warunek)
for (wyr1; wyr2; wyr3) instrukcja
for (zmn in tabl) instrukcja

break
continue
delete tabl[indeks]
delete tabl
exit [ wyrażenie ]
{ instrukcje }

Zob. 9. Instrukcje sterujące w akcjach.

A.5.3. Instrukcje wejścia/wyjścia

Mamy następujące instrukcje wejścia/wyjścia:

getline
Pobiera $0 z kolejnego rekordu wejściowego; nadaje wartości NF, FNR i NR. Zob. 5.8. Odczyt bezpośredni przez getline.
getline <plik
Pobiera $0 z kolejnego rekordu pliku; nadaje wartość NF.
getline zmn
Pobiera zmn z kolejnego rekordu wejściowego; nadaje wartości NR, FNR.
getline zmn <plik
Pobiera zmn z kolejnego rekordu pliku.
polecenie | getline
Uruchamia polecenie, przesyłając potokiem jego wyjście do getline; nadaje wartości $0, NF, NR.
polecenie | getline zmn
Uruchamia polecenie, przesyłając potokiem jego wyjście do getline; nadaje wartość zmn.
next
Przerywa przetwarzanie aktualnego rekordu wejściowego. Czytany jest następny rekord a przetwarzanie zaczyna się ponownie od pierwszego wzorca programu awk. Jeżeli osiągnięto koniec danych wejściowych, wykonywane są reguły (reguła) END, jeśli istnieją. Zob. 9.7. Instrukcja next.
nextfile
Przerywa przetwarzanie bieżącego pliku wejściowego. Następny czytany rekord wejściowy pochodzi z kolejnego pliku wejściowego. Aktualizowane jest FILENAME, FNR otrzymuje wartość jeden, zwiększa się ARGIND, a przetwarzanie zaczyna się ponownie od pierwszego wzorca programu awk. Jeżeli osiągnięto koniec danych wejściowych, wykonywane są reguły (reguła) END, jeśli istnieją. Wcześniejsze wersje gawk stosowały `next file'; składnia ta jest nadal obsługiwana, ale uważana za niezalecaną. Zob. 9.7. Instrukcja next.
print
Wypisuje bieżący rekord wejściowy. Zob. 6. Wypisywanie wyjścia.
print lista-wyr
Wypisuje wyrażenia.
print lista-wyr > plik
Wypisuje wyrażenia do pliku. Jeśli plik nie istnieje, jest tworzony. Jeśli istnieje, za pierwszym razem, gdy wykonywane jest print, jego zawartość jest usuwana.
print lista-wyr >> plik
Wypisuje wyrażenia do pliku. Poprzednia zawartość pliku pozostaje zachowana, a wyjście print jest dopisywane do pliku.
print lista-wyr | polecenie
Wypisuje wyrażenia, wysyłając wyjście potokiem do polecenia. Potok do polecenia pozostaje otwarty do momentu wywołania funkcji close.
printf fmt, lista-wyr
Formatuje i wypisuje.
printf fmt, lista-wyr > plik
Formatuje i wypisuje do pliku. Jeśli plik nie istnieje, jest tworzony. Jeśli istnieje, za pierwszym razem, gdy wykonywane jest printf, jego zawartość jest usuwana.
printf fmt, lista-wyr >> plik
Formatuje i wypisuje do pliku. Poprzednia zawartość pliku pozostaje zachowana, a wyjście printf jest dopisywane do pliku.
printf fmt, lista-wyr | polecenie
Formatuje i wypisuje, wysyłając wyjście potokiem do polecenia. Potok do polecenia pozostaje otwarty do momentu wywołania funkcji close.

getline zwraca zero na końcu pliku, a -1 przy błędzie. W przypadku błędu, getline nadaje zmiennej ERRNO wartość zależnego od systemu łańcucha, który opisuje błąd.

A.5.4. Podsumowanie printf

Specyfikacja konwersji ma postać %[flaga][szer][.dokł]format. Elementy w nawiasach kwadratowych są opcjonalne.

W awk instrukcja printf i funkcja sprintf przyjmują poniższe formaty określające konwersję:

%c
Znak ASCII. Jeżeli użyty dla `%c' argument jest numeryczny, traktowany jest jak znak i wypisywany. W przeciwnym wypadku, zakłada się, że jest łańcuchem, i wypisywany jest tylko pierwszy znak tego łańcucha.
%d
%i
Liczba dziesiętna (część całkowita).
%e
%E
Liczba zmiennoprzecinkowa postaci `[-]d.dddddde[+-]dd'. Format `%E' stosuje `E' zamiast `e'.
%f
Liczba zmiennoprzecinkowa postaci [-]ddd.dddddd.
%g
%G
Używa albo formatu `%e' albo `%f', zależnie od tego, który z nich daje krótszy łańcuch, z eliminacją nieznaczących zer. `%G' stosuje `%E' zamiast `%e'.
%o
Liczba ósemkowa bez znaku (także całkowita).
%u
Liczba dziesiętna bez znaku (znów, całkowita).
%s
Łańcuch znaków.
%x
%X
Liczba szesnastkowa bez znaku (całkowita). Format `%X' stosuje litery `A' do `F' zamiast `a' do `f' dla dziesiętnych 10 do 15.
%%
Pojedynczy znak `%'; nie jest przekształcany żaden argument.

Opcjonalne, dodatkowe parametry, które mogą wystąpić pomiędzy `%' a literą sterującą:

-
Wyrażenie powinno być w swoim polu wyrównane do lewej.
spacja
W konwersjach numerycznych poprzedza wartości dodatnie spacją, a ujemne znakiem minus.
+
Znak plus użyty przed modyfikatorem szerokości (zob. niżej), nakazuje w konwersjach numerycznych zawsze podawać znak, nawet jeśli dane do sformatowania są dodatnie. Modyfikator `+' przesłania modyfikator spacji.
#
Stosuje "alternatywną postać" dla niektórych liter sterujących. Przy `%o', zapewnia początkowe zero. Przy `%x' i `%X' zapewnia początkowe `0x' lub `0X' dla wyniku niezerowego. Przy `%e', `%E' i `%f' wynik będzie zawsze zawierał kropkę dziesiętną. Przy `%g' i `%G' końcowe zera nie są usuwane z wyniku.
0
Początkowe `0' (zero) działa jak flaga, wskazująca, że wyjście powinno być dopełnione zerami zamiast spacjami. Odnosi się to także do nienumerycznych formatów wyjściowych. Flaga ta ma znaczenie tylko gdy pole jest szersze niż wartość do wypisania.
szer
Pole powinno zostać wypełnione do tej szerokości. Normalnie dopełniane jest spacjami. Jeżeli użyto flagi `0', to jest dopełniane zerami.
.dokł
Liczba określająca dokładność, jaka ma być użyta zastosowana przy wypisywaniu. Przy formatach `e', `E' i `f' podaje liczbę cyfr, jakie mają być wypisane na prawo od kropki dziesiętnej. Przy formatach `g' i `G' określa maksymalną ilość cyfr znaczących. Przy formatach `d', `o', `i', `u', `x' i `X' określa minimalną liczbę cyfr do wypisania. Dla formatu `s' podaje maksymalną liczbę znaków łańcucha, jakie winny zostać wypisane.

Każda z wartości szer i dokł, albo obie z nich, może być podana jako `*'. Wówczas, konkretna ich wartość pobierana jest z listy argumentów.

Zob. 6.5. Wymyślne wyjście dzięki instrukcji printf.

A.5.5. Specjalne nazwy plików

Podczas wykonywania przekierowań wejścia/wyjścia z print czy printf do pliku, albo za poprzez getline z pliku, gawk rozpoznaje wewnętrznie pewne specjalne nazwy plików. Nazwy te umożliwiają dostęp do otwartych deskryptorów plików odziedziczonych przez gawk po procesie macierzystym (zwykle powłoce). Nazwami tymi są:

`/dev/stdin'
Standardowe wejście.
`/dev/stdout'
Standardowe wyjście.
`/dev/stderr'
Standardowe wyjście błędów.
`/dev/fd/n'
Plik oznaczony otwartym deskryptorem n.

Dodatkowo, odczyt poniższych plików zapewnia informację związaną z procesem wykonywanego programu gawk. Wszystkie zwracane rekordy zakończone są znakiem nowej linii.

`/dev/pid'
Zwraca ID procesu dla bieżącego procesu.
`/dev/ppid'
Zwraca ID procesu macierzystego dla bieżącego procesu.
`/dev/pgrpid'
Zwraca ID grupy procesu dla bieżącego procesu.
`/dev/user'
Co najmniej cztery, oddzielone spacjami, pola, zawierające wartości zwracane przez funkcje systemowe getuid, geteuid, getgid i getegid. Jeśli występują dodatkowe pola, to są one identyfikatorami grup zwróconymi przez funkcję systemową getgroups. (Przynależność do wielu grup może nie być obsługiwana na wszystkich systemach.)

Z tych nazw plików można też korzystać w wierszu poleceń do wskazania plików danych. Jeśli w rzeczywistości plików o tych nazwach nie ma w systemie, to są one rozpoznawane tylko wewnętrznie.

Zob. 6.7. Specjalne nazwy plików w gawk, gdzie umieszczono dłuższy opis z uzasadnieniem tej cechy.

A.5.6. Funkcje wbudowane

awk udostępnia wiele funkcji wbudowanych do wykonywania działań na liczbach, łańcuchach czy operacji wejścia/wyjścia.

Wbudowane funkcje arytmetyczne:

atan2(y, x)
Arcus tangens z y/x w radianach.
cos(wyr)
Cosinus wyr, podanego w radianach.
exp(wyr)
Potęga naturalna o wykładniku wyr (e^wyr).
int(wyr)
Obcięcie do całkowitej.
log(wyr)
Logarytm naturalny z wyr.
rand()
Liczba losowa między zero a jeden.
sin(wyr)
Sinus wyr, podanego w radianach.
sqrt(wyr)
Pierwiastek kwadratowy.
srand([wyr])
Wykorzystuje wyr jako nowe ziarno generatora liczb losowych. Jeżeli nie podano wyr, to używany jest bieżący czas. Wartością zwracaną jest poprzednie ziarno generatora liczb losowych.

awk ma następujące wbudowane funkcje łańcuchowe:

gensub(regex, zastąp, jak [, cel])
Jeżeli jak jest łańcuchem zaczynającym się od `g' lub `G', to wszystkie dopasowania regex w cel zastępowane są przez zastąp. W przeciwnym razie, zastępowane jest jakie kolejne wystąpienie. Jeżeli nie podano celu, to używane jest $0. Wartością zwracaną jest zmieniony łańcuch -- oryginalny cel nie jest modyfikowany. Wewnątrz zastąp, do wskazania tekstu pasującego do n-tego podwyrażenia w nawiasach stosuje się `\n', gdzie n jest cyfrą od zera do dziewięciu. Funkcja gensub jest specyficzna dla gawk.
gsub(regex, zastąp [, cel])
Zastępuje każdy podłańcuch łańcucha cel pasujący do wyrażenia regularnego regex łańcuchem zastąp. Zwraca liczbę zastąpień. Jeżeli nie podano celu, używane jest $0.
index(łańc, szuk)
Zwraca pozycję łańcucha szuk w łańcuchu łańc, lub zero jeśli nie występuje szuk.
length([łańc])
Zwraca długość łańcucha łańc. Jeżeli nie podano argumentu, zwracana jest długość $0.
match(łańc, regex)
Zwraca pozycję w łańc, na której pojawia się wyrażenie regularne regex, albo zero jeśli regex nie występuje, i nadaje wartości zmiennym RSTART i RLENGTH.
split(łańc, tabl [, regex])
Dzieli łańcuch na kawałki rozdzielane przez wyrażenie regularne regex i umieszczane w tablicy tabl. Zwraca liczbę elementów. Jeżeli pominięto regex, to zamiast niego używane jest FS. regex może być łańcuchem pustym, co spowoduje umieszczenie każdego znaku w osobnym elemencie tablicy. Na początku wymazywana jest tablica tabl.
sprintf(fmt, lista-wyr)
Wypisuje listę-wyr zgodnie z fmt i zwraca wynikowy łańcuch.
sub(regex, zastąp [, cel])
Tak jak gsub, ale zastępowany jest tylko pierwszy pasujący podłańcuch.
substr(łańc, indeks [, ])
Zwraca -znakowy podłańcuch łańcucha łańc zaczynający się od pozycji indeks. Jeżeli pominięto , używana jest reszta łańc.
tolower(łańc)
Zwraca kopię łańcucha łańc ze wszystkimi dużymi znakami zamienionymi na odpowiadające im małe. Znaki niealfabetyczne pozostawione są bez zmian.
toupper(łańc)
Zwraca kopię łańcucha łańc ze wszystkimi małymi znakami zamienionymi na odpowiadające im duże. Znaki niealfabetyczne pozostawione są bez zmian.

Funkcje związane z wejściem/wyjściem:

close(wyr)
Zamyka otwarty plik lub potok wskazywany przez wyr.
fflush([wyr])
Opróżnia wszelkie buforowane wyjście do pliku wyjściowego lub potoku wskazanego przez wyr. Jeżeli pominięto wyr, opróżniane jest standardowe wyjście. Jeśli wyr jest łańcuchem pustym (""), opróżniane są wszystkie bufory wyjściowe.
system(wiersz-polec)
Uruchamia polecenie wiersz-polec i zwraca jego kod zakończenia. Jeżeli dany system operacyjny nie obsługuje funkcji system, wywołanie jej spowoduje błąd krytyczny. `system("")' można wykorzystać do wymuszonego opróżnienia przez awk oczekującego wyjścia. Jest to bardziej przenośne, ale mniej oczywiste, niż wywołanie fflush.

A.5.7. Funkcje czasu

Do pobierania bieżącego czasu i formatowania znaczników czasu dostępne są dwie kolejne funkcje. Są one specyficzne dla gawk.

systime()
Zwraca czas bieżący jako liczbę sekund od konkretnej Epoki (północ 1 stycznia 1970 UTC, na systemach POSIX-owych).
strftime([format[, timestamp]])
Formatuje znacznik czasu timestamp zgodnie ze specyfikacją formatu. Jeżeli nie podano timestamp to stosowany jest czas bieżący. Jeżeli nie podano formatu, stosowany jest domyślny format równoważny jest wyjściu tworzonemu przez narzędzie date. Zob. 12.5. Funkcje obsługi znaczników czasu, gdzie zamieszczono szczegółowy opis specyfikatorów konwersji przyjmowanych przez strftime.

Zob. 12. Funkcje wbudowane, gdzie zamieszczono opis wszystkich funkcji wbudowanych awk.

A.5.8. Stałe łańcuchowe

Stałe łańcuchowe w awk są ciągami znaków ujętymi w cudzysłowy zwykłe ("). Wewnątrz łańcuchów rozpoznawane są pewne sekwencje specjalne, jak w C. Są to:

\\
Dosłowny odwrotny ukośnik (backslash).
\a
Znak dzwonka (alarm, "alert"), zwykle znak ASCII BEL.
\b
Backspace.
\f
Wysuw strony, formfeed.
\n
Nowa linia, newline.
\r
Powrót karetki, carriage return.
\t
Tabulacja pozioma.
\v
tabulacja pionowa.
\xcyfry szesnastkowe
Znak reprezentowany przez łańcuch cyfr szesnastkowych występujących po `\x'. Jak w ANSI C, wszystkie kolejne cyfry szesnastkowe uważane są za część tej sekwencji specjalnej. Np., "\x1B" jest łańcuchem złożonym ze znaku ASCII ESC (escape). (Sekwencja specjalna `\x' nie występuje w POSIX-owym awk.)
\ddd
Znak reprezentowany przez jedno-, dwu- lub trzycyfrową sekwencję cyfr ósemkowych. Zatem, "\033" jest również łańcuchem złożonym ze znaku ASCII ESC (escape).
\c
Dosłowny znak c, jeśli c nie jest jednym z powyższych.

Z sekwencji specjalnych można też korzystać wewnątrz stałych wyrażeń regularnych (np., wyrażenie regularne /[ \t\f\n\r\v]/ dopasowuje białe znaki).

Zob. 4.2. Sekwencje specjalne.

A.6. Funkcje definiowane przez użytkownika

Funkcje w awk są definiowane następująco:

function nazwa(lista-parametrów) { instrukcje }

Do konkretyzowania parametrów formalnych, deklarowanych w funkcji, używane są parametry aktualne dostarczone w wywołaniu funkcji. Tablice przekazywane są przez wskazanie, inne zmienne przez wartość.

Jeżeli przekazano mniej parametrów niż występuje nazw w liście-parametrów, to dodatkowe nazwy otrzymują jako wartość łańcuch pusty. Dodatkowe nazwy działają jak zmienne lokalne.

Nawias otwierający w wywołaniu funkcji definiowanej przez użytkownika musi występować bezpośrednio po nazwie funkcji, bez wtrąconego odstępu. Ma to na celu uniknięcie niejednoznaczności składni i mylenia z operatorem konkatenacji.

Zamiast function może być używane słowo func (ale nie w POSIX awk).

Zwracanie wartości przez funkcję uzyskuje się instrukcją return.

Zob. 13. Funkcje definiowane przez użytkownika.

A.7. Cechy historyczne

gawk obsługuje dwie cechy historycznych implementacji awk.

Po pierwsze, możliwe jest wywoływanie funkcji wbudowanej length nie tylko bez argumentów, lecz nawet bez nawiasów!

a = length

to to samo, co którekolwiek z

a = length()
a = length($0)

Na przykład:

$ echo abcdef | awk '{ print length }'
-| 6

Cechę tę w standardzie POSIX oznaczono jako "niezalecaną", a gawk wyśle ostrzeżenie o jej użyciu jeżeli w wierszu poleceń podano `--lint'. (Możliwość takiego sposobu użycia length była w oryginalnej implementacji uniksowego awk w rzeczywistości przypadkowa. Jeżeli jakakolwiek funkcja korzystała z $0 jako argumentu domyślnego, to możliwe było wywoływanie jej bez nawiasów. W szczególności, powszechną praktyką było korzystanie w ten sposób z funkcji length, i ten sposób użycia udokumentowano w podręczniku man awk.)

Inną cechą historyczną jest stosowanie instrukcji break albo continue poza ciałem pętli while, for lub do. Tradycyjne implementacje awk traktowały taki sposób użycia jako równoważny instrukcji next. Nowsze wersje uniksowego awk na to nie zezwalają. gawk obsługuje taki sposób użycia jeśli podano `--traditional'.

Zob. 14.1. Opcje wiersza poleceń, gdzie bliżej opisano opcje `--posix' i `--lint'.

 


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

 
Linki sponsorowane

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

Akceptuję pliki cookies z tej witryny.