Provided by:
manpages-pl_20060617-3_all 
NAZWA
mawk - jzyk wyszukiwania wzorcow i przetwarzania tekstu
SK/LADNIA
mawk [-W opcja] [-F warto] [-v zmn=warto]
[--] 'tekst programu' [plik...]
mawk [-W opcja] [-F warto] [-v zmn=warto]
[-f plik-programu] [--] [plik...]
OPIS
mawk jest interpreterem jzyka programowania AWK. Jzyk AWK jest uyteczny
w dzialaniach na plikach danych, wyszukiwaniu i przetwarzaniu tekstu
oraz tworzeniu prototypow i eksperymentowaniu z algorytmami. mawk
implementuje jzyk AWK, jak go zdefiniowali Aho, Kernighan i Weinberger
w ksice The AWK Programming Language, Addison-Wesley Publishing, 1988
(dalej wzmiankowanej jako ksika AWK). mawk jest zgodny z definicj
jzyka AWK ze standardu Posix 1003.2 (propozycja 11.3), zawierajc nowe
cechy nie opisane w ksice AWK. Dodatkowo mawk zawiera nieco rozszerze.
Program AWK jest sekwencj par wzorzec {akcja} i definicji funkcji.
Krotkie programy wprowadzane s w wierszu polece, zwykle ujte w ' ', by
unikn interpretacji ich skladowych przez powlok. Dlusze programy mog
by czytane z pliku przy pomocy opcji -f. dane wejciowe odczytywane s
z listy plikow z wiersza polece lub ze standardowego wejcia, gdy lista
ta jest pusta. Wejcie rozbijane jest na rekordy okrelone wedlug
zmiennej opisujcej separator rekordow, RS (record separator). Pocztkowo
RS="\n" a rekordy s tosame z wierszami. Kady z rekordow porownywany
jest z kadym ze wzorc'ow, a jeli pasuje, wykonywany jest tekst programu
dla {akcji}.
OPCJE
-F warto ustawia separator pol, FS, na warto.
-f plik Tekst programu jest czytany z pliku zamiast z wiersza
polece. Dopuszcza si wielokrotne uycie opcji -f.
-v zmn=warto przypisuje warto zmiennej programu zmn.
-- wskazuje jednoznaczny koniec opcji.
Powysze opcje bd dostpne w kadej zgodnej z Posix implementacji AWK.
Opcje specyficzne dla danej implementacji poprzedzane s przez -W. mawk
udostpnia sze takich rozszerze:
-W version mawk wypisuje sw wersj i prawa autorskie na stdout
(standardowym wyjciu), za wkompilowane ograniczenia na
stderr (standardowym wyjciu bldow). Koczy prac z kodem
0.
-W dump wypisuje na stdout asembleropodobny listing wewntrznej
reprezentacji programu i koczy prac z kodem 0 (przy
pomylnej kompilacji).
-W interactive ustawia niebuforowane zapisy na stdout i buforowane
wierszami odczyty z stdin (standardowego wejcia).
Rekordy z stdin s wierszami niezalenie od wartoci RS.
-W exec plik Tekst programu czytany jest z pliku i jest to ostatnia
opcja. Przydatne na systemach obslugujcych konwencj
"liczb magicznych" #! dla skryptow wykonywalnych.
-W sprintf=num ustawia rozmiar bufora wewntrznego sprintf na num
bajtow. Czstsze ni sporadyczne stosowanie tej opcji
wskazuje, e mawk powinien zosta zrekompilowany.
-W posix_space wymusza na mawk, by nie uwaal '\n' za odstp.
Rozpoznawane s krotkie postacie -W[vdiesp], za w niektorych systemach
-We jest obowizkowe dla uniknicia ogranicze dlugoci wiersza polece.
JZYK AWK
1. Struktura programu
Program w jzyku AWK jest sklada si z sekwencji par wzorzec {akcja} i
definicji funkcji uytkownika.
Wzorcem moe by:
BEGIN
END
wyraenie
wyraenie, wyraenie
Mona pominc jeden z elementow z pary wzorzec {akcja}, ale nie oba.
Jeeli pominito {akcj}, to jest ni domniemane { print }. Jeeli pominito
wzorzec, to jest on niejawnie dopasowany. Wzorce BEGIN i END wymagaj
akcji.
Instrukcje zakoczone s znakami nowej linii, rednikami lub oboma tymi
znakami. Grupy instrukcji, jak akcje czy ciala ptli, lczone s w bloki
za porednictwem { ... }, jak w C. Ostatnia instrukcja w bloku nie
wymaga znaku koczcego. Puste wiersza nie maj znaczenia; pusta
instrukcja zakoczona jest rednikiem. Dlugie instrukcje mona kontynuowa
przy pomocy odwrotnego ukonika \. Instrukcj mona podzieli midzy
wiersze bez uycia odwrotnego ukonika po przecinku, nawiasie
otwierajcym, &&, ||, do, else, nawiasie zamykajcym instrukcji if, while
lub for oraz nawiasie zamykajcym definicji funkcji. Komentarze
zaczynaj si od # i rozcigaj si do a koca wiersza, cho go nie obejmuj.
Ponisze instrukcje steruj przeplywem programu wewntrz blokow.
if ( wyra ) instrukcja
if ( wyra ) instrukcja else instrukcja
while ( wyra ) instrukcja
do instrukcja while ( wyra )
for ( wyr_opc ; wyr_opc ; wyr_opc ) instrukcja
for ( zmn in tablica ) instrukcja
continue
break
2. Typy danych, konwersja i por'ownywanie
Istniej dwa podstawowe typy danych, numeryczny i lacuch znakowy. Stale
liczbowe mog by calkowite, jak -2, dziesitne jak 1.08, lub podane w
notacji naukowej jak -1.1e4 czy .28E-3. Wszystkie liczby s
reprezentowane wewntrznie w arytmetyce zmiennoprzecinkowej. Wszystkie
obliczenia rownie s zmiennoprzecinkowe. Tak wic, na przyklad, wyraenie
0.2e2 == 20 jest prawd. Prawda reprezentowana jest jako 1.0.
Stale lacuchowe ujte s w cudzyslowy.
"To jest lacuch ze znakiem nowej linii na kocu.\n"
Lacuchy znakowe mog by kontynuowane w kolejnych wierszach dziki
poprzedzeniu znaku nowej linii odwrotnym ukonikiem (\). Rozpoznawane s
nastpujce sekwencje specjalne:
\\ \
\" "
\a dzwonek, ascii 7
\b backspace, ascii 8
\t tabulacja, ascii 9
\n znak nowej linii, newline , ascii 10
\v tabulacja pionowa, ascii 11
\f wysuw strony, formfeed, ascii 12
\r powrot karetki, carriage return, ascii 13
\ddd 1, 2 lub 3 cyfry osemkowe dla ascii ddd
\xhh 1 lub 2 cyfry szesnastkowe dla ascii hh
Jeeli odwrotnym ukonikiem zostanie poprzedzony inny znak, np. \c,
wynikiem bdzie sekwencja rodlowa: \c, tzn. mawk zignoruje specjalne
wlaciwoci odwrotnego ukonika.
Naprawd istniej trzy podstawowe typy danych; trzecim jest liczba i
/lacuch, posiadajcy rownoczenie warto liczbow i warto lacuchow. Zmienne
definiowane przez uytkownika pojawiaj si przy pierwszym ich uyciu i s
inicjowane na null, typu "liczba i lacuch", majce warto numeryczn 0 a
lacuchow "". Nietrywialne dane typu liczbowo-lacuchowego pochodz z
wejcia i zwykle przechowywane s w polach (zobacz sekcja 4).
Typ wyraenia okrelany jest przez jego kontekst. W razie potrzeby
wykonywana jest automatyczna konwersja typow. Na przyklad, wyznaczenie
wartoci instrukcji
y = x + 2 ; z = x "hello"
Warto przechowywana w zmiennej y otrzyma typ numeryczny. Jeeli x nie
jest numeryczne, to warto odczytana z x zostanie skonwertowana na liczb
przed dodaniem do 2 i zachowaniem w y. Warto przechowywana w zmiennej
z bdzie typu lacuchowego: warto x zostanie przeksztalcona na lacuch,
jeli bdzie to niezbdne, i zlczona z "hello". Oczywicie, warto i typ
przechowywane w x nie zmieniaj si w adnej z tych konwersji. Wyraenie
lacuchowe przeksztalcane jest na numeryczne przy zastosowaniu
najdluszego swego przedrostka numerycznego jak w atof(3). Wyraenie
numeryczne konwertowane jest na lacuch poprzez zastpienie wyra przez
sprintf(CONVFMT, wyra), chyba e wyra moe by reprezentowane w danym
komputerze jako dokladna liczba calkowita, wowczas przeksztalcane jest
na sprintf("%d", wyra). Sprintf() jest funkcj wbudowan AWK, dublujc
dzialanie sprintf(3), za CONVFMT jest wbudowan zmienn uywan do
wewntrznej konwersji z liczby na lacuch i inicjowan na "%.6g". Mona
wymusi jawn konwersj typow: wyra "" jest lacuchowe, a wyra+0 jest
numeryczne.
Przy wyliczaniu, wyra1 op-rel wyra2, jeeli oba operandy s numeryczne
lub numeryczno-lacuchowe, to porownywanie jest numeryczne; jeeli oba
operandy s lacuchami to porownywanie jest lacuchowe; jeli jeden z
operandow jest lacuchem, to operand nie-lacuchowy jest przeksztalcany i
porownywanie jest lacuchowe. Wynik jest numeryczny, 1 lub 0.
W kontekstach logicznych, jak if ( wyra ) instrukcja, wartoci wyraenia
lacuchowego jest prawda wtedy i tylko wtedy, gdy nie jest ono lacuchem
pustym ""; wyrae liczbowych wtedy i tylko wtedy gdy nie s numerycznie
zerem.
3. Wyraenia regularne
W jzyku AWK rekordy, pola i lacuchy s czsto sprawdzane na dopasowanie
do wyraenia regularnego. Wyraenia regularne umieszczone s midzy
ukonikami, a
wyra ~ /r/
jest wyraeniem AWK o wartoci 1 jeli wyra "pasuje do" r, co oznacza, e
pewien podlacuch wyra jest w zestawie lacuchow zdefiniowanych przez r.
Jeli nie wystpuje dopasowanie, to wyraenie otrzymuje warto 0;
zastpienie ~ operatorem "nie pasuje", !~, odwraca znaczenia. Pary
wzorzec-akcja
/r/ { akcja } i $0 ~ /r/ { akcja }
s takie same, za dla kadego rekordu wejciowego pasujcego do r
wykonywana jest akcja. Faktycznie, /r/ jest wyraeniem AWK rownowanym
($0 ~ /r/) wszdzie z wyjtkiem wystpienia po prawej stronie operatora
dopasowania lub przekazywania do funkcji wbudowanej oczekujcej jako
argumentu wyraenia regularnego.
AWK stosuje rozszerzone wyraenia regularne jak egrep(1). Metaznakami
wyrae regularnych, tj. znakami o specjalnym znaczeniu w wyraeniach
regularnych s
^ $ . [ ] | ( ) * + ?
Wyraenia regularne konstruowane s ze znakow jak niej:
c dopasowuje dowolny znak nie bdcy metaznakiem c.
\c dopasowuje znak zdefiniowany przez t sam sekwencj
specjaln uywan w stalych lacuchowych lub doslowny
znak c jeli \c nie jest sekwencj specjaln.
. dopasowuje dowolny znak (lcznie ze znakiem nowej
linii).
^ dopasowuje pocztek lacucha.
$ dopasowuje koniec lacucha.
[c1c2c3...] dopasowuje dowolny znak z klasy c1c2c3... . Zakres
znakow oznaczany jest przez c1-c2 wewntrz klasy
[...].
[^c1c2c3...] dopasowuje dowolny znak nie nalecy do klasy
c1c2c3...
Wyraenia regularne konstruowane s z innych wyrae regularnych w
nastpujcy sposob:
r1r2 dopasowuje r1, bezporednio po ktorym nastpuje r2
(konkatenacja).
r1 | r2 dopasowuje r1 lub r2 (alternatywa).
r* dopasowuje zero lub wicej wystpie r .
r+ dopasowuje jedno lub wicej r.
r? dopasowuje zero lub jedno r.
(r) dopasowuje r, umoliwiajc grupowanie.
Operatory wedlug rosncego priorytetu: alternatywa, konkatenacja
(zlczenie) i operatory jednoargumentowe (*, + lub ?).
Na przyklad,
/^[_a-zA-Z][_a-zA-Z0-9]*$/ i
/^[-+]?([0-9]+\.?|\.[0-9])[0-9]*([eE][-+]?[0-9]+)?$/
dopasowuj odpowiednio identyfikatory AWK i stale liczbowe AWK. Zauwa,
e kropka . musi by chroniona odwrotnym ukonikiem, by zostala rozpoznana
jako kropka dziesitna, a nie dopasowanie dowolnego znaku, a metaznaki
wewntrz klas znakow trac swe specjalne znaczenie.
Po prawej stronie operatorow ~ lub !~ moe zosta uyte dowolne wyraenie.
Podobnie, dowolne wyraenie mona przekaza do funkcji wbudowanej
oczekujcej wyraenia regularnego. W razie potrzeby zostanie ono
przeksztalcone na lacuch, a nastpnie zinterpretowane jako wyraenie
regularne. Na przyklad,
BEGIN { identifier = "[_a-zA-Z][_a-zA-Z0-9]*" }
$0 ~ "^" identifier
wypisuje wszystkie wiersze zaczynajce si od jakiego identyfikatora AWK.
mawk rozpoznaje puste wyraenie regularne, //, dopasowujce lacuch pusty.
Zatem pasuje do niego dowolny lacuch na pocztku, kocu i pomidzy
dowolnym znakiem. Na przyklad,
echo abc | mawk '{ gsub(//, "X") ; print }'
XaXbXcX
4. Rekordy i pola
Rekordy czytane s po jednym na raz, i przechowywane w zmiennej $0.
Rekord rozbijany jest na pola, przechowywane w $1, $2, ..., $NF.
Wbudowana zmienna NF ustawiana jest na liczb pol, a NR i FNR s
zwikszane o 1. Pola powyej $NF ustawiane s na "".
Przypisanie do $0 powoduje, e pola i NF s obliczane ponownie.
Przypisanie do NF lub do pola powoduje, e $0 jest ponownie tworzone
przez zlczenie kolejnych pol separowanych przez OFS. Przypisanie do
pola o indeksie wikszym od NF, powiksza NF i powoduje ponowne
utworzenie $0.
Dane wejciowe przechowywane w polach s lacuchami, chyba e cale pole ma
posta numeryczn a wowczas typ jest liczbowo-lacuchowy. Na przyklad,
echo 24 24E |
mawk '{ print($1>100, $1>"100", $2>100, $2>"100") }'
0 1 1 1
$0 i $2 s lacuchami a $1 jest liczbowo-lacuchowe. Pierwsze porownanie
jest numeryczne, drugie lacuchowe, trzecie lacuchowe (100 jest
konwertowane na "100"), i ostatnie lacuchowe.
5. Wyraenia i operatory
Skladnia wyrae jest podobna jak w C. Wyraeniami pierwotnymi s stale
liczbowe, stale lacuchowe, zmienne, pola, tablice i wywolania funkcji.
Identyfikator zmiennej, tablicy bd funkcji moe by cigiem liter, cyfr i
znakow podkrelenia, nie rozpoczynajcym si od cyfry. Zmienne nie s
deklarowane; zaistniej przy pierwszym do nich odwolaniu, a inicjowane s
na null.
Nowe wyraenia tworzone s z uyciem poniszych, podanych w kolejnoci
rosncego priorytetu, operatorow:
przypisanie = += -= *= /= %= ^=
warunkowe ? :
logiczne or ||
logiczne and &&
przynaleno do tablicy in
dopasowanie ~ !~
relacyjne < > <= >= == !=
konkatenacja (bez specjalnego operatora)
dodawanie/odejmowanie + -
mnoenie/dzielenie * / %
jednoargumentowe + -
logiczne not !
potgowanie ^
inkrementacja/dekr. ++ -- (zarowno post jak i pre)
pole $
Przypisanie, operatory warunkowe i potgowanie wi od prawej do lewej;
pozostale od lewej do prawej. Kade wyraenie moe by umieszczone w
nawiasach.
6. Tablice
Awk obsluguje tablice jednowymiarowe. Elementy tablic wskazuje si jako
tablica[wyra]. Wyra jest przeksztalcane wewntrznie na typ lacuchowy,
wic, na przyklad, A[1] i A["1"] s tym samym elementem, a faktycznym
indeksem jest "1". Tablice indeksowane lacuchami zwane s tablicami
asocjacyjnymi (tablicami przyporzdkowujcymi). Pierwotnie tablica jest
pusta; elementy zaistniej przy pierwszym do nich odwolaniu. Wyraenie
wyra in tablica daje w wyniku 1 jeeli istnieje tablica[wyra], w
przeciwnym razie 0.
Istnieje posta instrukcji for wykonujca ptl po wszystkich indeksach
tablicy.
for ( zmn in tablica ) instrukcja
ustawia zmn na kady z indeksow tablicy i wykonuje instrukcj. Kolejno,
w jakiej zmn przechodzi przez indeksy tablicy nie jest zdefiniowana.
Instrukcja delete tablica[wyra], powoduje usunicie tablica[wyra]. mawk
obsluguje rozszerzenie, delete tablica, ktore usuwa wszystkie elementy
tablicy.
Tablice wielowymiarowe tworzone s sztucznie przez konkatenacj z
zastosowaniem wbudowanej zmiennej SUBSEP. tablica[wyra1,wyra2] jest
rownowanikiem tablica[wyra1 SUBSEP wyra2]. Sprawdzanie elementu
tablicy wielowymiarowej uywa indeksu w nawiasach, jak w
if ( (i, j) in A ) print A[i, j]
7. Zmienne wbudowane
Ponisze zmienne s zmiennymi wbudowanymi. S one inicjowane przed
wykonaniem programu.
ARGC liczba argumentow wiersza polece.
ARGV tablica argumentow wiersza polece, 0..ARGC-1.
CONVFMT format do wewntrznej konwersji liczb na lacuchy,
pocztkowo = "%.6g".
ENVIRON tablica zaindeksowana zmiennymi rodowiska. Lacuch
rodowiska, zmn=warto przechowywany jest jako
ENVIRON[zmn] = warto.
FILENAME nazwa biecego pliku wejciowego.
FNR numer biecego rekordu w FILENAME.
FS dzieli rekordy na pola jako wyraenie regularne.
NF liczba pol biecego rekordu.
NR numer biecego rekordu w calkowitym strumieniu
wejciowym.
OFMT format do wydruku liczb; pocztkowo = "%.6g".
OFS wstawiane pomidzy polami w wyjciu, pocztkowo = " ".
ORS koczy kady z rekordow wyjciowych, pocztkowo = "\n".
RLENGTH dlugo ustawiona przez ostatnie wywolanie wbudowanej
funkcji match().
RS separator rekordow wejciowych, pocztkowo = "\n".
RSTART indeks ustawiony przez ostatnie wywolanie match().
SUBSEP uywany do budowy indeksow tablic wielowymiarowych,
pocztkowo = "\034".
8. Funkcje wbudowane
Funkcje lacuchowe
gsub(r,s,t) gsub(r,s)
Zastpowanie globalne (global substitution), kade
dopasowanie wyraenia regularnego r w zmiennej t
zastpowane jest lacuchem s. Zwracana jest liczba
wykonanych zastpie. Jeeli pominito t, to uywane jest $0.
Znak & w lacuchu zastpujcym s zastpowany jest dopasowanym
podlacuchem lacucha t. \& oraz \\ daj, odpowiednio,
doslowne & i \ w lacuchu zastpujcym.
index(s,t)
Jeeli t jest podlacuchem s, to zwracana jest pozycja, na
ktorej rozpoczyna si t, w przeciwnym razie zwracane jest
0. Pierwszy znak s jest na pozycji 1.
length(s)
Zwraca dlugo lacucha s.
match(s,r)
Zwraca indeks pierwszego najdluszego dopasowania wyraenia
regularnego r w lacuchu s. Zwraca 0 jeli nie wystpuje
dopasowanie. Jako skutek uboczny, nastpuje ustawienie
RSTART na zwracan warto. RLENGTH ustawiane jest na dlugo
dopasowania lub -1 jeli brak dopasowania. Jeeli
dopasowano lacuch pusty, to RLENGTH ustawiane jest na 0,
a zwracane jest 1 jeli dopasowanie bylo na pocztku, za
length(s)+1, gdy na kocu lacucha.
split(s,A,r) split(s,A)
Lacuch s rozbijany jest na pola przez wyraenie regularne
r a pola wpisywane s do tablicy A. Zwracana jest liczba
pol. Szczegoly w sekcji 11 poniej. Jeeli pominito r,
uywane jest FS.
sprintf(format,lista-wyra)
Zwraca lacuch utworzony z listy-wyrae zgodnie z formatem.
Zobacz opis printf() poniej.
sub(r,s,t) sub(r,s)
Pojedyncze zastpienie. Takie samo, jak gsub(), z wyjtkiem
tego, e wykonywane jest co najwyej jedno zastpienie.
substr(s,i,n) substr(s,i)
Zwraca podlacuch lacucha s, poczynajc od indeksu i, o
dlugoci n. Jeli pominito n, zwracana jest kocowka s,
poczynajc od pozycji i.
tolower(s)
Zwraca kopi s ze wszystkimi duymi literami
przeksztalconymi na male.
toupper(s)
Zwraca kopi s ze wszystkimi malymi literami
przeksztalconymi na due.
Funkcje arytmetyczne
atan2(y,x) arcus tangens z y/x pomidzy -PI i PI.
cos(x) funkcja cosinus, x w radianach.
exp(x) funkcja wykladnicza.
int(x) zwraca x obcite w stron zera.
log(x) logarytm naturalny.
rand() zwraca liczb losow midzy zero a jeden.
sin(x) funkcja sinus, x w radianach.
sqrt(x) zwraca pierwiastek kwadratowy z x.
srand(wyra) srand()
Inicjuje ziarenko generatora liczb losowych, uywajc
zegara jeli pominito wyra, i zwraca warto poprzedniego
ziarenka losowego. mawk inicjuje generator liczb
losowych wedlug zegara przy uruchomieniu, wic nie ma
faktycznej potrzeby wywolywania srand(). Srand(wyra)
przydaje si do powtarzania cigow pseudolosowych.
9. Wejcie i wyjcie
Istniej dwie instrukcje wyjcia: print i printf.
print zapisuje na standardowe wyjcie $0 ORS.
print wyra1, wyra2, ..., wyran
zapisuje na standardowe wyjcie wyra1 OFS wyra2 OFS ...
wyran ORS. Wyraenia numeryczne s konwertowane na lacuchy
zgodnie z OFMT.
printf format, lista-wyra
powiela funkcj biblioteczn printf z C, piszc na
standardowe wyjcie. Rozpoznawany jest komplet
specyfikacji formatow z ANSI C z konwersjami %c, %d, %e,
%E, %f, %g, %G, %i, %o, %s, %u, %x, %X i %%, oraz
kwalifikatorami konwersji h i l.
Lista argumentow print lub printf moe by opcjonalnie ujta w nawiasy.
Print formatuje liczby przy pomocy OFMT lub "%d" dla dokladnie
calkowitych. "%c" z argumentem numerycznym wypisuje odpowiedni znak
8-bitowy, z argumentem lacuchowym wypisuje pierwszy znak lacucha.
Wyjcie print i printf mona przekierowa do pliku lub polecenia dolczajc
> plik, >> plik lub | polecenie na kocu instrukcji drukowania.
Przekierowanie otwiera plik lub polecenie tylko raz, kolejne
przekierowania dolczane s do ju otwartego strumienia. Zgodnie z
konwencj, mawk lczy nazw pliku "/dev/stderr" z stderr, co pozwala na
przekierowanie wynikow print i printf na standardowe wyjcie
diagnostyczne. mawk wie rownie, odpowiednio, "-" i "/dev/stdout" z
stdin i stdout, co umoliwia przysylanie tych strumieni do funkcji.
Funkcja wejcia getline ma nastpujce warianty:
getline
czyta do $0, aktualizuje pola, NF, NR i FNR.
getline < plik
czyta do $0 z pliku, aktualizuje pola i NF.
getline zmn
czyta nastpny rekord do zmiennej zmn, aktualizuje NR i
FNR.
getline zmn < plik
czyta nastpny rekord pliku do zmiennej zmn.
polecenie | getline
przesyla potokiem rekord z polecenia do $0 i aktualizuje
pola i NF.
polecenie | getline zmn
przesyla potokiem rekord z polecenia do zmiennej zmn.
Getline zwraca 0 na kocu pliku, -1 przy bldzie, w pozostalych
przypadkach 1.
Polecenia na kocu potokow wykonywane s przez /bin/sh.
Funkcja close(wyra) zamyka plik lub potok skojarzony z wyra. Close
zwraca 0 jeeli wyra jest otwartym plikiem, kod zakoczenia jeli wyra
jest poleceniem potoku, a -1 w pozostalych przypadkach. Close
stosowane jest do ponownego odczytu pliku lub polecenia, upewnienia si,
e drugi koniec potoku wyjciowego jest zakoczony lub do zachowania
zasobow plikowych.
Funkcja fflush(wyra) wymiata plik wyjciowy lub potok skojarzony z wyra.
Fflush zwraca 0 jeli wyra jest otwartym strumieniem wyjciowym, w
przeciwnym razie -1. Fflush bez argumentu opronia stdout. Fflush z
pustym argumentem ("") opronia wszystkie otwarte wyjcia.
Funkcja system(wyra) wykorzystuje /bin/sh do wykonania wyra i zwraca
kod zakoczenia polecenia wyra. Zmiany tablicy ENVIRON nie s
przekazywane poleceniom wykonywanym przez system lub potoki.
10. Funkcje definiowane przez uytkownika
Funkcja definiowana przez uytkownika ma nastpujc skladni:
function nazwa( argumenty ) { instrukcje }
Cialo funkcji moe zawiera instrukcj zwrocenia wartoci (return)
return opcjonalne-wyra
Instrukcja return nie jest wymagana. Wywolania funkcji mog by
zagniedane lub rekurencyjne. Wyraenia przekazywane s funkcjom przez
warto a tablice przez wskazanie. Dodatkowe argumenty slu jako zmienne
lokalne i s inicjowane na null. Na przyklad, csplit(s,A) wstawia kady
znak s do tablicy A i zwraca dlugo s.
function csplit(s, A, n, i)
{
n = length(s)
for( i = 1 ; i <= n ; i++ ) A[i] = substr(s, i, 1)
return n
}
Wstawienie dodatkowych odstpow pomidzy przekazywanymi parametrami a
zmiennymi lokalnymi wynika z konwencji. Do funkcji mona odwolywa si
przed ich zdefiniowaniem, ale nazwa funkcji i nawias '(' rozpoczynajcy
list argumentow musz si styka, by unikn pomylki z konkatenacj.
11. Podzia/l /lacuch'ow, rekord'ow i plik'ow
Programy awk uywaj tego samego algorytmu do rozbicia lacuchow na
tablice przy pomocy split() i rekordow na pola wedlug FS. mawk stosuje
zasadniczo ten sam algorytm przy podziale plikow na rekordy wedlug RS.
Split(wyra,A,sep) dziala nastpujco:
(1) Jeeli pominito sep, to jest on zastpowany przez FS. Sep
moe by wyraeniem lub wyraeniem regularnym. Jeeli jest
wyraeniem typu nie-lacuchowego, to jest przeksztalcane na
lacuch.
(2) Jeli sep = " " (pojedyncza spacja), to <ODSTP> jest
obcinana z pocztku i koca wyra, a sep staje si <ODSTPEM>.
mawk definiuje <ODSTP> jako wyraenie regularne
/[ \t\n]+/. W przeciwnym wypadku sep traktowany jest
jako wyraenie regularne, z wyjtkiem tego, e metaznaki dla
lacucha o dlugoci 1 s ignorowane, np. split(x, A, "*") i
split(x, A, /\*/) s tym samym.
(3) Jeeli wyra nie jest lacuchem, jest przeksztalcane na
lacuch. Jeeli wyra jest wowczas lacuchem pustym "", to
split() zwraca 0 a A jest ustawiane jako puste. W
przeciwnym razie, wszystkie nienakladajce si, niepuste i
najdlusze dopasowania sep w wyra, dziel wyra na pola,
ktore wpisywane s do A. Pola s umieszczane w A[1], A[2],
..., A[n] a split() zwraca n, liczb pol, rown liczbie
dopasowa plus jeden. Dane umieszczone w A wygldajce na
numeryczne otrzymuj typ liczbowo-lacuchowy.
Podzial rekordow na pola dziala tak samo, z wyjtkiem tego, i czci
wpisywane s do $1, $2,..., $NF. Jeeli $0 jest puste, NF jest ustawiane
na 0 a wszystkie $i na "".
mawk dzieli pliki na rekordy przy pomocy tego samego algorytmu, ale z t
niewielk ronic, i RS jest faktycznie cigiem koczcym a nie separatorem.
(ORS te jest faktycznie cigiem koczcym).
Np., jeeli FS = ":+" a $0 = "a::b:" , to NF = 3 a $1 = "a", $2 =
"b" i $3 = "", ale jeeli zawartoci pliku wejciowego jest
"a::b:", za RS = ":+", to istniej dwa rekordy "a" i "b".
RS = " " nie ma specjalnego znaczenia.
Jeeli FS = "", to mawk rozbija rekord na pojedyncze znaki, i, podobnie
split(s,A,"") umieszcza poszczegolne znaki s w A.
12. Rekordy wielowierszowe
Poniewa mawk interpretuje RS jako wyraenie regularne, obsluga rekordow
wielowierszowych jest latwa. Ustawienie RS = "\n\n+", powoduje, e
rekordy rozdzielane s co najmniej jednym pustym wierszem. Jeeli FS = "
" (domylnie), to pojedyncze znaki nowej linii, wedlug zasad <ODSTPU>
powyej, staj si odstpami a pojedyncze znaki nowej linii s separatorami
pol.
Na przyklad, jeli w pliku jest "a b\nc\n\n", RS = "\n\n+" a FS =
" ", to mamy jeden rekord "a b\nc" z trzema polami "a", "b" i
"c". Zmiana FS = "\n", daje dwa pola "a b" i "c"; zmieniajc FS
= "", otrzymujemy jedno pole identyczne jak rekord.
Traktowanie wierszy ze spacjami lub tabulacjami jako pustych mona
uzyska ustawiajc RS = "\n([ \t]*\n)+". W celu utrzymania zgodnoci z
innymi implementacjami awk, ustawienie RS = "" daje te same wyniki, co
usunicie pustych wierszy z pocztku i koca pliku i okrelanie rekordow
tak, jakby RS = "\n\n+". Posix wymaga, by "\n" zawsze separowalo
rekordy gdy RS = "" niezalenie od wartoci FS. mawk nie obsluguje tej
konwencji, gdy zdefiniowanie "\n" jako <ODSTPU> czyni j zbdn.
W wikszoci przypadkow zmieniajc RS w celu obslugi rekordow
wielowierszowych, stosuje si te zmienione na "\n\n" ORS, aby na wyjciu
zachowa odstpy midzy rekordami.
13. Wykonywanie programu
Ta sekcja opisuje kolejno wykonywania programu. Po pierwsze, ARGC
ustawiane jest na calkowit liczb argumentow wiersza polece przekazanych
do fazy wykonania programu. ARGV[0] ustawiane jest na nazw
interpretera AWK a ARGV[1] ... ARGV[ARGC-1] przechowuje pozostale
argumenty wiersza polece z wyjtkiem opcji i rodla programu. Na
przyklad, dla
mawk -f prog v=1 A t=hello B
ARGC = 5 oraz ARGV[0] = "mawk", ARGV[1] = "v=1", ARGV[2] = "A", ARGV[3]
= "t=hello" i ARGV[4] = "B".
Nastpnie wykonywany jest kolejno kady z blokow BEGIN. Jeeli program
sklada si wylcznie z blokow BEGIN, to na tym wykonywanie si koczy, w
przeciwnym razie otwierany jest strumie wejciowy i wykonywanie jest
kontynuowane. Jeeli ARGC rowna si 1, strumie wejciowy ustawiany jest
na stdin, w przypadku przeciwnym w poszukiwaniu argumentu plikowego
sprawdzane s argumenty wiersza polece ARGV[1] ... ARGV[ARGC-1].
Argumenty wiersza polece dziel si na trzy grupy: argumenty plikowe,
argumenty przypisa i lacuchy puste "". Przypisanie ma posta
zmn=/lacuch. Podczas sprawdzania ARGV[i] jako moliwego argumentu
plikowego, jeli jest ono puste to jest pomijane; jeli jest argumentem
typu przypisania, odbywa si przypisanie wartoci zmiennej zmn a i
zmienia si na nastpny argument; w pozostalych przypadkach ARGV[i] jest
otwierane jako wejcie. Jeeli otwarcie nie powiedzie si, wykonywanie
programu jest koczone z kodem 2. Jeeli aden z argumentow wiersza
polece nie jest argumentem plikowym, to wejcie pochodzi z stdin.
Getline w akcji BEGIN otwiera wejcie. "-" jako argument plikowy
oznacza stdin.
Po otwarciu strumienia wejciowego kady z rekordow wejcia sprawdzany
jest z kadym ze wzorc'ow, a jeli pasuje, to wykonywana jest akcja
skojarzona z danym wzorcem. Wzorzec w postaci wyraenia pasuje jeli
jego wartoci logiczn jest prawda (zobacz koniec sekcji 2). Wzorzec
BEGIN zestawiany jest przed rozpoczciem odczytu wejcia, za wzorzec END
po przeczytaniu calego wejcia. Wzorzec zakresu, wyra1,wyra2,
dopasowuje kady rekord pomidzy rekordem pasujcym do wyra1 a rekordem
pasujcym do wyra2 lcznie z nimi.
Po napotkaniu koca pliku w strumieniu wejciowym, sprawdzane s pozostale
argumenty wiersza polece w poszukiwaniu kolejnego argumentu plikowego.
Jeli taki istnieje, to jest otwierany, w przeciwnym wypadku przyjmuje
si, e zostal dopasowany wzorzec END i wykonywane s wszystkie akcje END.
W rozwaanym przykladzie, przypisanie v=1 ma miejsce po wykonaniu akcji
BEGIN, a dana umieszczona w v otrzymuje typ liczbowo-lacuchowy.
Nastpnie z pliku A jest czytane wejcie. Po kocu pliku A, zmienna t
jest ustawiana na lacuch "hello", a B jest otwierany jako wejcie. Po
osigniciu koca pliku B s wykonywane akcje wzorca END.
Przebieg programu na poziomie wzorzec {akcja} mona zmieni przy pomocy
instrukcji
next
exit wyra-opcjonalne.
Instrukcja next powoduje, e odczyt nastpnego rekordu wejciowego i
ponowne sprawdzanie wzorcow, od pierwszej pary wzorzec {akcja}
programu. Polecenie exit powoduje natychmiastowe wykonanie akcji END
lub zakoczenie programu, jeli nie ma takich akcji lub jeeli exit
wystpilo w akcji END. wyra-opcjonalne ustawia warto kodu zakoczenia
programu, chyba e zostanie ona przeslonita przez poniejszy exit lub
ujawniony potem bld.
PRZYK/LADY
1. emulacja cat.
{ print }
2. emulacja wc.
{ chars += length($0) + 1 # dodaje jeden dla \n
words += NF
}
END{ print NR, words, chars }
3. zliczanie niepowtarzajcych si "faktycznych slow".
BEGIN { FS = "[^A-Za-z]+" }
{ for(i = 1 ; i <= NF ; i++) word[$i] = "" }
END { delete word[""]
for ( i in word ) cnt++
print cnt
}
4. sumowanie drugiego pola kadego rekordu w oparciu o pierwsze pole.
$1 ~ /credit|gain/ { sum += $2 }
$1 ~ /debit|loss/ { sum -= $2 }
END { print sum }
5. sortowanie pliku, porownywanie lacuchowe
{ line[NR] = $0 "" } # wymusza typ porownywania: gdyby
# jakie wiersze wygldaly
# na numeryczne
END { isort(line, NR)
for(i = 1 ; i <= NR ; i++) print line[i]
}
#sortowanie A[1..n] metod wstawiania
function isort( A, n, i, j, hold)
{
for( i = 2 ; i <= n ; i++)
{
hold = A[j = i]
while ( A[j-1] > hold )
{ j-- ; A[j+1] = A[j] }
A[j] = hold
}
# w razie potrzeby bdzie utworzony wartownik A[0] = ""
}
KWESTIE ZGODNOCI
Posix-owa 1003.2 (propozycja 11.3) definicja jzyka AWK jest AWK
opisanym w ksice AWK z kilkoma rozszerzeniami, jakie pojawily si w nawk
z SystemVR4. Rozszerzeniami tymi s:
Nowe funkcje: toupper() i tolower().
Nowe zmienne: ENVIRON[] i CONVFMT.
Specyfikacje konwersji w printf() i sprintf() wzite z ANSI C.
Nowe opcje polecenia: -v zmn=warto, wielokrotne opcje -f i
opcje charakterystyczne dla implementacji jako argumenty -W.
Posix-owy AWK przetwarza pojedyncze wiersze plikow. RS mona zmieni z
"\n" na inny pojedynczy znak, ale trudno jest znale jakie tego
zastosowanie -- w ksice AWK brak odpowiednich przykladow. Zgodnie z
konwencj, RS = "", powoduje, e jeden lub wicej pustych wierszy
rozdziela rekordy, umoliwiajc obslug rekordow wielowierszowych. Gdy RS
= "", "\n" jest zawsze separatorem pol, niezalenie od wartoci FS.
mawk, z kolei, pozwala by RS bylo wyraeniem regularnym. Pojawiajce si
w rekordach "\n" jest traktowane jak odstp, a FS zawsze okrela pola.
Pozbycie si paradygmatu operowania pojedynczym wierszem moe uproci
niektore programy i czsto poprawi wydajno. Na przyklad, zmienieniony
przyklad 3 (zobacz powyej),
BEGIN { RS = "[^A-Za-z]+" }
{ word[ $0 ] = "" }
END { delete word[ "" ]
for( i in word ) cnt++
print cnt
}
zlicza ilo niepowtarzajcych si slow przez traktowanie kadego slowa jako
rekordu. Przy plikach rednich rozmiarow mawk wykonuje go dwukrotnie
szybciej, dziki uproszczonej ptli wewntrznej.
Poniszy program zastpuje kady z komentarzy w pliku programu C pojedyncz
spacj,
BEGIN {
RS = "/\*([^*]|\*+[^/*])*\*+/"
# komentarz jest separatorem rekordow
ORS = " "
getline hold
}
{ print hold ; hold = $0 }
END { printf "%s" , hold }
Buforowanie rekordu jest niezbdne, by unikn zakoczenia ostatniego z
rekordow spacj.
W mawk ponisze wyraenia s rownowane,
x ~ /a\+b/ x ~ "a\+b" x ~ "a\\+b"
Powysze lacuchy bd analizowane dwukrotnie: raz jako lacuch i raz jako
wyraenie regularne. Przy analizie lacucha mawk ignoruje stosowanie
cytowania odwrotnym ukonikiem do znakow nie bdcych znakami specjalnymi,
zatem \c interpretuje jako \c. Natomiast ksika AWK przychyla si do
tego, by \c bylo rozpoznawane jako c, co wymaga podwojonego cytowania
metaznakow w lacuchach. Posix wprost odmawia zdefiniowania podanego
zachowania, przez co porednio wymusza na programach muszcych dziala z
ronymi wersjami awk stosowanie bardziej przenonego, lecz mniej
czytelnego, cytowania z uyciem podwojnych odwrotnych ukonikow.
Posix-owy AWK nie rozpoznaje "/dev/std{out,err}" ani sekwencji
specjalnej \x hex w lacuchach. W przeciwiestwie do ANSI C, mawk
ogranicza liczb cyfr, jakie mog wystpowa po \x do dwoch, gdy obecna
implementacja obsluguje tylko znaki 8-bitowe. Wbudowane fflush
pojawilo si po raz pierwszy w ostatnim (1993) awk AT&T wydanym dla
netlib, i nie jest czci standardu Posix. Calociowe usuwanie tablicy
przez delete tablica nie jest czci standardu Posix.
Posix jawnie zostawia niezdefiniowane zachowanie si FS = "" i wspomina
o podziale rekordow na znaki jako moliwej interpretacji, ale obecnie
takie zastosowanie nie jest przenone midzy implementacjami.
Na koniec, sposob w jaki mawk obsluguje przypadki wyjtkowe nie opisane
w ksice AWK ani w propozycji Posix. Niebezpiecznie jest zakladanie
spojnoci pomidzy implementacjami awk, a bezpiecznie przej do nastpnej
sekcji.
substr(s, i, n) zwraca znaki lacucha s o pozycjach z czci
wspolnej przedzialu zamknitego [1, length(s)] i polotwartego [i,
i+n). Gdy cz wspolna jest pusta, zwracany jest lacuch pusty;
zatem substr("ABC", 1, 0) = "" a substr("ABC", -4, 6) = "A".
Kady lacuch, nawet pusty, pasuje pocztkiem do lacucha pustego,
wic s ~ // i s ~ "", s zawsze rowne 1, tak jak match(s, //) i
match(s, ""). Ostanie dwa ustawiaj RLENGTH na 0.
index(s, t) jest zawsze tym samym, co match(s, t1), gdzie t1, to
to samo, co t z cytowanymi metaznakami. Std spojno z match
wymaga, by index(s, "") zawsze zwracalo 1. Rownie warunek:
index(s,t) != 0 wtedy i tylko wtedy, gdy t jest podlacuchem
lacucha s, wymusza by index("","") = 1.
Jeeli getline napotka koniec pliku, getline zmn pozostawia
zmienn zmn bez zmian. Podobnie, w momencie rozpoczcia akcji END,
wartoci $0, pol i NF pozostaj niezmienione od ostatniego
rekordu.
ZOBACZ TAKE
egrep(1)
Aho, Kernighan and Weinberger, The AWK Programming Language, Addison-
Wesley Publishing, 1988, (ksika AWK), definiuje jzyk, rozpoczynajc si
samouczkiem a dochodzc do wielu interesujcych programow i wchodzc
glboko w kwestie projektowania i analizy programow istotne przy
programowaniu w kadym jzyku.
The GAWK Manual, The Free Software Foundation, 1991, stanowi podrcznik
i opis jzyka nie usilujcy sign glbi ksiki AWK. Zaklada, e czytelnik moe
by pocztkujcym programist. Sekcja powicona tablicom w AWK jest
doskonala. Omawia take wymagania stawiane AWK przez Posix.
B/LDY
mawk nie obsluguje znaku ascii NUL \0 w plikach rodlowych czy plikach
danych. Mona wypisa NUL przy pomocy printf z %c, a w wejciu s
dopuszczalne wszystkie inne znaki 8-bitowe.
mawk implementuje printf() i sprintf() przy pomocy funkcji
bibliotecznych C, printf i sprintf, wic pelna zgodno z ANSI wymaga
biblioteki ANSI C. W praktyce oznacza to, e kwalifikator konwersji h
moe nie by dostpny. mawk przejmuje te wszystkie bldy czy ograniczenia
tych funkcji.
Tworcy implementacji jzyka AWK ukazali zgodny brak wyobrani w nazywaniu
swych programow.
AUTOR
Mike Brennan (brennan@whidbey.com).
INFORMACJE O T/LUMACZENIU
Powysze tlumaczenie pochodzi z nieistniejcego ju Projektu Tlumaczenia
Manuali i moe nie by aktualne. W razie zauwaenia ronic midzy powyszym
opisem a rzeczywistym zachowaniem opisywanego programu lub funkcji,
prosimy o zapoznanie si z oryginaln (angielsk) wersj strony podrcznika.