awk
Podstawową funkcją awk jest wyszukiwanie w plikach wierszy (lub innych
jednostek tekstu) zawierających pewien wzorzec. Gdy wiersz pasuje do jednego
ze wzorców, awk wykonuje na nim zadane akcje.
awk kontynuuje takie przetwarzanie wierszy wejściowych aż do
osiągnięcia końca plików wejściowych.
Programy w awk różnią się od programów w większości innych języków,
gdyż są sterowane danymi (data-driven): to znaczy, opisujemy dane,
z którymi chcemy pracować, a następnie co zrobić po ich znalezieniu.
Inne języki przeważnie są proceduralne; musimy opisać, bardzo
szczegółowo, każdy krok jaki ma być wykonany przez program. Pracując w
językach proceduralnych zwykle dużo trudniej jest precyzyjnie opisać dane,
jakie będzie przetwarzał program. Z tego powodu, programy awk są
często budująco łatwe zarówno w pisaniu jak i czytaniu.
Przy uruchamianiu awk, określa się program awk, mówiący
awk, co ma zrobić. Program taki składa się z szeregu reguł.
(Może też zawierać definicje funkcji, zaawansowaną cechę, o której
na razie nie będziemy mówić.
Zob. 13. Funkcje definiowane przez użytkownika.) Każda reguła określa jeden
wzorzec jaki ma być szukany i jedną akcję jaka zostanie wykonana po
znalezieniu tego wzorca.
Składniowo, reguła składa się ze wzorca, po którym następuje akcja. Akcja
ujęta jest w nawiasy klamrowe, co oddziela ją od wzorca.
Reguły są zwykle rozdzielane znakami nowej linii. Stąd też program
awk wygląda tak:
wzorzec { akcja }
wzorzec { akcja }
...
Język awk rozwijał się przez wiele lat. Pełne szczegóły podano w
17. Ewolucja języka awk.
Język opisany w tej książce często określany jest jako "nowy awk".
Z tego powodu wiele systemów posiada kilka wersji awk.
Niektóre z systemów mają narzędzie awk implementujące pierwotną wersję
języka awk a narzędzie nawk do nowej wersji. Inne mają
oawk dla "starego (old) języka awk" zaś zwykłe awk do
nowego. Pozostałe wciąż maja tylko jedną wersję, zwykle
nową.(2)
Wszystko to razem powoduje, że podczas pisania programów trudno powiedzieć,
jaką z wersji awk powinno się uruchomić. Najlepszą radą, jaką
możemy tu podać, jest sprawdzenie lokalnej dokumentacji. Szukaj awk,
oawk i nawk, również gawk. Możliwe, że masz w systemie
jakąś wersję nowego awk, i uruchamiając swoje programy właśnie jej
powinieneś używać. (Oczywiście, jeżeli czytasz tę książkę, są duże szanse
na to, że masz gawk!)
W całej tej książce, odnosząc się do cechy języka, która powinna być dostępna
w każdej pełnej implementacji POSIX awk, używamy po prostu terminu
awk. Pisząc o możliwości specyficznej dla implementacji GNU,
posługujemy się terminem gawk.
awk
Istnieje kilka sposobów uruchamiania programu awk. Jeśli program jest
krótki, najłatwiej zawrzeć go w wierszu poleceń uruchamiającym awk,
w ten sposób:
awk 'program' plik-wej1 plik-wej2 ...
gdzie program składa się z szeregu wzorców i akcji, jak opisano
wcześniej. (Przyczyna użycia pojedynczych cudzysłowów jest opisana poniżej,
w 2.2.1. Programy awk jednorazowego użytku.)
Gdy program jest długi, zwykle wygodniej umieścić go w pliku i uruchamiać w taki sposób:
awk -f plik-programu plik-wej1 plik-wej2 ...
awk jednorazowego użytku
Gdy zapoznasz się już z awk, będziesz często wpisywał proste programy
w chwili, gdy zechcesz z nich skorzystać. Można wówczas zapisywać takie
programy jako pierwszy argument polecenia awk, tak:
awk 'program' plik-wej1 plik-wej2 ...
gdzie program składa się z szeregu wzorców i akcji, jak to opisano wcześniej.
Ten format polecenia nakazuje powłoce, interpreterowi
poleceń, uruchomienie awk i użycie programu do przetwarzania
rekordów w pliku (plikach) wejściowym. Wokół programu postawiono
pojedyncze cudzysłowy (apostrofy), tak że powłoka nie zinterpretuje żadnych
znaków awk jako znaków specjalnych powłoki. Powodują one również, że
powłoka potraktuje cały program jako pojedynczy argument awk i
pozwalają, by program był dłuższy niż jeden wiersz.
Ten format przydaje się też do uruchamiania krótkich i średnich programów
awk ze skryptów powłoki, gdyż unika potrzeby stosowania odrębnego
pliku z programem awk. Samodzielny skrypt powłoki jest bardziej
niezawodny, ponieważ nie ma innych plików, które mogłyby być źle
umieszczone.
3. Przydatne programy jednolinijkowe, pokazuje kilka krótkich, samodzielnych programów.
Na marginesie, ciekawe, że polecenie
awk '/foo/' pliki ...
jest w gruncie rzeczy tym samym, co
egrep foo pliki ...
awk bez plików wejściowych
Można też uruchamiać awk bez plików wejściowych. Jeżeli wpiszemy
w wierszu poleceń:
awk 'program'
to awk zastosuje program do standardowego wejścia, co
zwykle oznacza to, co wpisujemy na terminalu. Trwa to do chwili wskazania
końca pliku przez naciśnięcie Control-d. (W innych systemach
operacyjnych, znak końca pliku może być odmienny. Na przykład, w OS/2
i MS-DOS, jest to Control-z.)
Na przykład, poniższy program wypisuje przyjazną poradę (z Douglasa Adamsa Autostopem przez Galaktykę), byś nie przejmował się zawiłościami programowania komputerów (`BEGIN' jest cechą, której jeszcze nie omawialiśmy).
$ awk "BEGIN { print \"Nie panikuj!\" }"
-| Nie panikuj!
$ awk "BEGIN { print \"Don't Panic!\" }"
-| Don't Panic!
Ten program w ogóle nie czyta wejścia. Znak `\' przed każdym z wewnętrznych cudzysłowów jest konieczny z powodu reguł cytowania powłoki, konkretnie dlatego, że mieszamy cudzysłowy pojedyncze z podwójnymi.
Kolejny prosty program awk symuluje narzędzie cat. Kopiuje
wszystko, co zostanie wpisane z klawiatury, na standardowe wyjście.
(Pokrótce wyjaśniono, dlaczego działa.)
$ awk '{ print }'
Now is the time for all good men
-| Now is the time for all good men
to come to the aid of their country.
-| to come to the aid of their country.
Four score and seven years ago, ...
-| Four score and seven years ago, ...
What, me worry?
-| What, me worry?
Control-d
Czasami programy awk są bardzo długie. W tym przypadku wygodniej
jest umieścić program w osobnym pliku. Chcąc nakazać awk użycie tego
pliku jako programu, wpisujemy:
awk -f plik-źródłowy plik-wej1 plik-wej2 ...
Opcja `-f' poleca narzędziu awk pobranie programu awk
z pliku plik-źródłowy. Jako plik-źródłowy można użyć dowolnej
nazwy pliku. Na przykład, można umieścić program:
BEGIN { print "Nie panikuj!" }
w pliku `porada'. Wówczas to polecenie:
awk -f porada
robi to samo, co to:
awk "BEGIN { print \"Nie panikuj!\" }"
które było objaśnione wcześniej
(zob. 2.2.2. Uruchamianie awk bez plików wejściowych).
Zauważ, że zwykle nie trzeba ujmować w pojedyncze cudzysłowy nazwy pliku
podawanego opcją `-f', gdyż większość nazw plików nie zawiera żadnych
znaków specjalnych powłoki. Zwróć uwagę, że w pliku `porada' program
awk nie jest ujęty w apostrofy. Są one potrzebne tylko dla programów
wpisywanych w wierszu poleceń awk.
Chcąc wyraźnie identyfikować pliki programów awk, można do nazwy pliku
dodać rozszerzenie `.awk'. Nie ma to wpływu na wykonanie programu
awk, ale ułatwia utrzymanie porządku.
awk
Gdy nauczyłeś się już awk, możesz pisać niezależne skrypty awk,
wykorzystując mechanizm skryptowy `#!'. Da się to zrobić w wielu
systemach uniksowych(3) (i pewnego dnia
w systemie GNU).
Na przykład, możemy zaktualizować nasz plik `porada' by wyglądał tak:
#! /bin/awk -f
BEGIN { print "Nie panikuj!" }
Po uczynieniu go plikiem wykonywalnym (narzędziem chmod), można
po prostu wpisać `porada' w wierszu powłoki, a system zorganizuje
uruchomienie awk(4) tak,
jakby wpisano `awk -f porada'.
$ porada -| !
Samodzielne skrypty awk są użyteczne, gdy chcemy napisać program,
który użytkownicy mogliby wywoływać bez potrzeby wiedzy o tym, że napisano
go w awk.
Uwaga! Nie powinno się umieszczać więcej niż jednego argumentu
w wierszu `#!' po ścieżce do awk. To nie zadziała. System
operacyjny traktuje resztę wiersza jako pojedynczy argument i przesyła go do
awk. Takie próby prowadzą do wprawiającego w zakłopotanie zachowania
się programu: najprawdopodobniej jakiegoś komunikatu diagnostycznego
awk o błędzie wywołania.
Niektóre ze starszych systemów nie obsługują mechanizmu `#!'. Można osiągnąć podobny skutek wykorzystując zwykły skrypt powłoki. Wyglądał by jakoś tak:
: Dwukropek zapewnia wykonanie przez standardową powłokę awk 'program' "$@"
Przy stosowaniu tej techniki kluczowe jest ujęcie programu w pojedyncze cudzysłowy, by uchronić go przed interpretacją przez powłokę. Jeżeli pominie się apostrofy, to wyniki może przewidzieć tylko czarodziej powłoki.
Sekwencja "$@" powoduje, że powłoka przekazuje wszystkie argumenty
wiersza poleceń programowi awk, bez ich interpretacji. Pierwszy
wiersz, zaczynający się dwukropkiem, zastosowano by skrypt powłoki działał
nawet wtedy, gdy wywoła go użytkownik korzystający z powłoki C (csh).
(Nie wszystkie starsze systemy przestrzegają tej konwencji, ale wiele to robi.)
awkKomentarz jest tekstem zawartym w programie ze względu na czytelnika-człowieka. Nie jest faktycznie częścią programu. Komentarze mogą objaśniać, co program robi, i jak działa. Prawie wszystkie języki programowania umożliwiają stosowanie komentarzy, gdyż bez takiej dodatkowej pomocy programy są na ogół trudne do zrozumienia.
W języku awk komentarz rozpoczyna się od znaku krzyżyka, `#',
i rozciąga się do końca wiersza. `#' nie musi być pierwszym znakiem
wiersza. Język awk ignoruje dalszą część wiersza następującą po
krzyżyku. Na przykład, możemy wstawić poniższe w `porada':
# Ten program wypisuje ładny przyjazny komunikat. Pomaga
# nowym użytkownikom uniknąć obaw przed komputerem.
BEGIN { print "Nie panikuj!" }
Można wstawiać wiersze komentarzy również w jednorazowe programy awk
wpisywane wprost z klawiatury, ale zwykle nie jest to zbyt przydatne.
Celem komentarza jest pomoc autorowi lub innej osobie w późniejszym
zrozumieniu programu.
Uwaga! Jak wspomniano w
2.2.1. Programy awk jednorazowego użytku,
małe i średnie programy można umieszczać w pojedynczych cudzysłowach, w celu
zachowania samodzielności skryptów powłoki. Przy takim postępowaniu,
nie należy umieszczać apostrofu (tj. pojedynczego cudzysłowu)
w komentarzu (lub jakimkolwiek innym miejscu programu). Powłoka
zinterpretuje go jako pojedynczy cudzysłów zamykający całość programu.
W rezultacie, zwykle powłoka wypisze komunikat o niedopasowanych
cudzysłowach, a jeśli awk rzeczywiście się uruchomi,
najprawdopodobniej wypisze dziwne komunikaty o błędach składniowych.
Na przykład:
awk 'BEGIN { print "hello" } # dź'bry, spryciarzu!'
Poniższe polecenie uruchamia prosty program awk wyszukujący w pliku
wejściowym `BBS-list' łańcucha znaków: `foo'. (Łańcuch znaków
zwykle nazywany jest łańcuchem. Określenie łańcuch jest zapewne
oparte na podobnie używanych w języku angielskim wyrażeniach "łańcuch
pereł" czy "łańcuch wagonów pociągu".)
awk '/foo/ { print $0 }' BBS-list
Gdy znalezione zostaną wiersze zawierające `foo', są one wypisywane, gdyż `print $0' oznacza wypisanie bieżącego wiersza. (Samo `print' znaczy to samo, więc moglibyśmy zapisać to i w taki sposób.)
Zwróć uwagę na ukośniki, `/', otaczające łańcuch `foo' w
naszym programie. Ukośniki wskazują, że `foo' jest wzorcem do
wyszukania. Ten rodzaj wzorca nazywany jest wyrażeniem regularnym
(regular expression), i jest szczegółowo opisany dalej.
(zob. 4. Wyrażenia regularne).
Dopuszcza się, by wzorzec pasował do części słów.
Wokół programu awk mamy pojedyncze cudzysłowy, więc powłoka nie
będzie interpretować żadnych z nich jako swych znaków specjalnych.
A oto, co wypisuje ten program:
$ awk '/foo/ { print $0 }' BBS-list
-| fooey 555-1234 2400/1200/300 B
-| foot 555-6699 1200/300 B
-| macfoo 555-6480 1200/300 A
-| sabafoo 555-2127 1200/300 C
Można pominąć jedną z reguł awk, wzorzec albo akcję, ale nie obie
naraz. Jeśli pominięto wzorzec, to akcja wykonywana jest dla każdego
wiersza wejściowego. Jeżeli pominięto akcję, to akcją domyślną jest
wypisanie wszystkich wierszy pasujących do danego wzorca.
Zatem, w powyższym przykładzie mogliśmy opuścić akcję (polecenie print
i nawiasy klamrowe), a wynik byłby taki sam: zostałyby wypisane wszystkie
wiersze pasujące do wzorca `foo'. Przez analogię, pominięcie instrukcji
print, ale pozostawienie nawiasów klamrowych tworzy pustą akcję, która
nic nie robi. Nie zostałyby wówczas wypisane żadne wiersze.
Narzędzie awk czyta pliki wejściowe po jednym wierszu. Dla każdego
wiersza awk wypróbowuje wzorce każdej z reguł. Jeżeli pasuje kilka
wzorców, to wykonywanych jest kilka akcji, w kolejności, w jakiej występują
w programie awk. Jeśli nie pasuje żaden wzorzec, to nie są wykonywane
żadne akcje.
Po przetworzeniu wszystkich reguł (może żadnej) pasujących do wiersza,
awk czyta następny wiersz (jednak,
zob. 9.7. Instrukcja next,
oraz zob. 9.8. Instrukcja nextfile).
Jest to powtarzane aż do napotkania końca pliku.
Na przykład, program awk:
/12/ { print $0 }
/21/ { print $0 }
zawiera dwie reguły. Pierwsza ma łańcuch `12' jako wzorzec a `print $0' jako akcję. Druga reguła ma łańcuch `21' za wzorzec, i także `print $0' jako akcję. Akcja każdej z reguł jest ujęta we własną parę nawiasów klamrowych.
Ten program awk wypisuje każdy wiersz, który zawiera łańcuch
`12' lub łańcuch `21'. Jeżeli wiersz zawiera oba te
łańcuchy, to jest wypisywany dwukrotnie, po jednym razie przez każdą
z reguł.
A oto, co się stanie, gdy uruchomimy ten program na naszych dwu przykładowych plikach danych, `BBS-list' i `inventory-shipped', jak pokazano niżej:
$ awk '/12/ { print $0 }
> /21/ { print $0 }' BBS-list inventory-shipped
-| aardvark 555-5553 1200/300 B
-| alpo-net 555-3412 2400/1200/300 A
-| barfly 555-7685 1200/300 A
-| bites 555-1675 2400/1200/300 A
-| core 555-2912 1200/300 C
-| fooey 555-1234 2400/1200/300 B
-| foot 555-6699 1200/300 B
-| macfoo 555-6480 1200/300 A
-| sdace 555-3430 2400/1200/300 A
-| sabafoo 555-2127 1200/300 C
-| sabafoo 555-2127 1200/300 C
-| Jan 21 36 64 620
-| Apr 21 70 74 514
Zwróć uwagę, że wiersz pliku `BBS-list' zaczynający się od `sabafoo' został wypisany dwukrotnie, po razie dla każdej z reguł.
A teraz przykład dający pojęcie o tym, co robią typowe programy awk.
Przykład ten pokazuje jak można wykorzystać awk do sumowania,
wybierania i reorganizacji wyjścia z innego narzędzia. Posługuje się
cechami, których jeszcze nie opisywaliśmy, więc nie przejmuj się jeśli nie
rozumiesz szczegółów.
ls -lg | awk '$6 == "Nov" { sum += $5 }
END { print sum }'
Polecenie to wypisuje całkowitą liczbę bajtów we wszystkich plikach bieżącego katalogu, które ostatnio były modyfikowane w listopadzie (November), dowolnego roku. (W powłoce C trzeba byłoby wpisać średnik a po nim odwrotny ukośnik na końcu pierwszego wiersza. W powłoce zgodnej z POSIX, jak powłoka Bourne'a czy Bash, GNU Bourne-Again shell, można wpisać przykład, jak pokazano.)
Część `ls -lg' tego przykładu jest poleceniem systemu dającym listę plików w katalogu, łącznie z rozmiarami plików i datami ich ostatniej zmiany. Jego wyjście może wyglądać tak:
-rw-r--r-- 1 arnold user 1933 Nov 7 13:05 Makefile -rw-r--r-- 1 arnold user 10809 Nov 7 13:03 gawk.h -rw-r--r-- 1 arnold user 983 Apr 13 12:14 gawk.tab.h -rw-r--r-- 1 arnold user 31869 Jun 15 12:20 gawk.y -rw-r--r-- 1 arnold user 22414 Nov 7 13:03 gawk1.c -rw-r--r-- 1 arnold user 37455 Nov 7 13:03 gawk2.c -rw-r--r-- 1 arnold user 27511 Dec 9 13:07 gawk3.c -rw-r--r-- 1 arnold user 7989 Nov 7 13:03 gawk4.c
Pierwsze pole zawiera prawa odczytu-zapisu, drugie liczbę dowiązań do pliku, a trzecie identyfikuje właściciela pliku. Czwarte pole identyfikuje grupę pliku. Piąte zawiera rozmiar pliku w bajtach. Szóste, siódme i ósme pole zawierają odpowiednio: miesiąc dzień i czas ostatniej modyfikacji pliku. Na koniec, pole dziewiąte zawiera nazwę pliku.
`$6 == "Nov"' w naszym programie awk jest wyrażeniem, które
sprawdza, czy szóste pole wyjścia z `ls -lg' pasuje do łańcucha
`Nov'. Za każdym razem, gdy wiersz ma w szóstym polu łańcuch
`Nov', wykonywana jest akcja `sum += $5'. Dodaje ona szóste pole
(rozmiar pliku) do zmiennej sum. W efekcie, gdy awk zakończy
odczyt wszystkich wierszy wejściowych, sum jest sumą rozmiarów plików,
których wiersze pasowały do wzorca. (To działa, gdyż zmienne awk są
automatyczne inicjowane na zero.)
Po przetworzeniu ostatniego wiersza wyjścia z ls, wykonywana jest
reguła END i wypisywana jest wartość sum. W tym przykładzie,
wartością sum byłoby 80600.
Takie bardziej zaawansowane techniki awk opisano w dalszych sekcjach
(zob. 8.2. Przegląd akcji). Zanim przejdziemy do
bardziej zaawansowanego programowania w awk, musimy wiedzieć jak
awk interpretuje zadane wejście i wyświetla wyjście. Operując na
polach i używając instrukcji print, można tworzyć bardzo przydatne
i robiące wrażenie raporty.
awk a wiersze
Najczęściej, każdy wiersz programu awk jest osobną instrukcją lub
osobną regułą, jak tu:
awk '/12/ { print $0 }
/21/ { print $0 }' BBS-list inventory-shipped
Jednak, gawk ignoruje znaki nowej linii po dowolnym z:
, { ? : || && do else
Nowa linia w każdym innym miejscu jest uważana za koniec instrukcji.
(Rozbicie wierszy po `?' i `:' jest drobnym rozszerzeniem
gawk. `?' i `:' odnoszą się tu do trójargumentowego
wyrażenia warunkowego opisanego
w 7.12. Wyrażenia warunkowe.)
Jeśli chcielibyśmy rozbić pojedynczą instrukcję na dwa wiersze w miejscu,
gdzie przerwałby ją znak nowej linii, możemy ją kontynuować kończąc
pierwszy wiersz znakiem odwrotnego ukośnika, `\'. Odwrotny ukośnik
musi być ostatnim znakiem wiersza, by został rozpoznany jako znak
kontynuacji. Jest to dozwolone absolutnie wszędzie w instrukcji awk,
nawet w środku łańcucha czy wyrażenia regularnego. Na przykład:
awk '/To wyrażenie regularne jest za długie, więc kontynuujemy je\
w kolejnym wierszu/ { print $1 }'
Na ogół w przykładowych programach niniejszej książki nie stosowaliśmy
kontynuacji odwrotnym ukośnikiem. Ponieważ w gawk nie ma ograniczenia
długości wiersza, nigdy nie jest to naprawdę konieczne; po prostu powoduje, że
programy są bardziej czytelne. Z tego samego powodu, jak również dla
klarowności, w większości staraliśmy się trzymać krótkich instrukcji
w przykładowych programach tu prezentowanych. Kontynuacja odwrotnym
ukośnikiem najbardziej przydaje się gdy program awk umieszczony jest
w odrębnym pliku, a nie wpisany w wierszu poleceń. Powinniśmy też zauważyć,
że wiele implementacji awk jest bardziej drobiazgowych co do miejsca,
w którym można użyć takiej kontynuacji. Zatem, dla maksymalnej przenośności
programów awk, najlepiej jest nie dzielić wierszy w środku wyrażeń
regularnych czy łańcuchów.
Uwaga: z powłoką C kontynuacja odwrotnym ukośnikiem nie działa
tak jak opisano powyżej. Kontynuacja z użyciem odwrotnego ukośnika
działa w programach zapisanych w plikach, jak też w jednorazowych programach
pod warunkiem, że używamy powłoki zgodnej z POSIX, jak powłoka
Bourne'a czy Bash, GNU Bourne-Again shell. Jednak powłoka C (csh)
zachowuje się odmiennie! Tam musimy użyć dwu kolejnych odwrotnych
ukośników, po których nastąpi znak nowej linii. Należy też pamiętać,
że przy stosowaniu powłoki C każdy znak nowej linii w programie awk
musi być poprzedzony odwrotnym ukośnikiem. Dla ilustracji:
% awk 'BEGIN { \
? print \\
? "hello, world" \
? }'
-| hello, world
Tu, `%' i `?' są głównym i pomocniczym znakiem zachęty powłoki C, analogicznie do znanych z powłok standardowych `$' i `>'.
awk jest językiem wierszowym ("line-oriented"). Akcja każdej reguły
musi się zaczynać w tym samym wierszu to wzorzec. Chcąc mieć wiersz i akcję
w osobnych wierszach, musimy użyć kontynuacji odwrotnym ukośnikiem
-- nie ma innego sposobu.
Zwróć uwagę, że kontynuacja odwrotnym ukośnikiem i komentarze nie
mieszają się. Gdy tylko awk zauważy `#' rozpoczynający
komentarz, ignoruje wszystko w pozostałej części wiersza. Na
przykład:
$ gawk 'BEGIN { print "nie panikuj" # przyjazne \
> BEGIN
> }'
error--> gawk: cmd. line:2: BEGIN
error--> gawk: cmd. line:2: ^ parse error
Wygląda to jakby odwrotny ukośnik miał kontynuować komentarz w następnym wierszu. Jednak kombinacja odwrotny ukośnik-nowa linia nie zostanie nigdy dostrzeżona, gdyż jest "ukryta" wewnątrz komentarza. Zatem, `BEGIN' odnotowywane jest jako błąd składni.
Gdy instrukcje awk wewnątrz jednej reguły są krótkie, można umieścić
więcej niż jedną w pojedynczym wierszu. Robi się to oddzielając
poszczególne instrukcje średnikiem, `;'.
Odnosi się do także do samych reguł. Zatem, poprzedni program możnaby zapisać:
/12/ { print $0 } ; /21/ { print $0 }
Zauważ: wymagania, by reguły w tym samym wierszu były rozdzielone
średnikiem nie było w pierwotnym języku awk; zostało dodane dla
utrzymania spójności z traktowaniem instrukcji wewnątrz akcji.
awk
Język awk dostarcza wielu predefiniowanych lub wbudowanych zmiennych,
których programy mogą używać do pozyskania informacji z awk. Istnieją
też inne zmienne, za pomocą których program może kontrolować sposób, w jaki
awk przetwarza dane.
Dodatkowo, awk udostępnia wiele wbudowanych funkcji do typowych
operacji obliczeniowych i związanych z łańcuchami.
Stopniowo podczas naszej prezentacji języka awk, wprowadzimy
większość zmiennych i wiele funkcji. Są one w sposób systematyczny
zdefiniowane w 10. Zmienne wbudowane i 12. Funkcje wbudowane.
awk
Zapewne zastanawiasz się, do czego może ci się przydać awk.
Wykorzystując programy narzędziowe, zaawansowane wzorce, operatory pól,
instrukcje arytmetyczne i inne kryteria wyboru możesz tworzyć bardziej
złożone wyniki. Język awk jest bardzo użyteczny w tworzeniu raportów
z ogromnych ilości danych pierwotnych, takich jak dane sumaryczne
z wyjścia innych programów narzędziowych, jak np. ls.
(Zob. 2.5. Bardziej złożony przykład.)
Programy napisane w awk są na ogół o wiele mniejsze, niż byłyby
w innych językach. Powoduje to, że są łatwe w tworzeniu i użyciu.
Często programy awk mogą być szybko ułożone przy terminalu, użyte
jednokrotnie i wyrzucone. Ponieważ są one interpretowane, można uniknąć
(zwykle długotrwałej) części typowego cyklu produkcyjnego oprogramowania
(edycja-kompilacja-testowanie-odpluskwianie), jaką jest kompilacja.
W awk napisano skomplikowane programy, łącznie z kompletnym
zmiennocelowym asemblerem dla mikroprocesorów ośmiobitowych (zob. D. Słownik,
gdzie znajduje się więcej informacji) i asemblerem mikrokodu dla
specjalizowanego komputera Prologu. Jednak możliwości awk przy
zadaniach tej złożoności są nadszarpnięte.
Jeśli zaczniesz pisać skrypty awk dłuższe niż, powiedzmy, kilkaset
linijek, powinieneś rozważyć użycie innego języka programowania. Emacsowy Lisp
jest dobrym wyborem jeśli potrzebujemy wyrafinowanych możliwości pracy
z łańcuchami i dopasowywaniem wzorców. Również powłoka jest dobra w
łańcuchach i dopasowywaniu wzorców; dodatkowo umożliwia stosowanie narzędzi
systemowych dające duże możliwości. Bardziej konwencjonalne języki,
jak C, C++ i Lisp, oferują lepsze środki wspomagające programowanie systemowe
i zarządzanie złożonością wielkich programów. Programy w tych językach mogą
wymagać większej liczby linii kodu źródłowego niż równoważne im programy
awk, lecz są łatwiejsze w konserwacji i zwykle działają efektywniej.
Przejdź do pierwszej, poprzedniej, następnej, ostatniej sekcji, spisu treści.