Home Dokumentacje Efektywne programowanie w AWK - Podręcznik użytkownika GNU awk - Zaczynamy pracę z awk
14 | 12 | 2019
Efektywne programowanie w AWK - Podręcznik użytkownika GNU awk - Zaczynamy pracę z awk Drukuj

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

 


 

2. Zaczynamy pracę z 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 }
...

2.1. Inne imię róży

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.

2.2. Jak uruchamiać programy 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 ...

2.2.1. Programy 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 ...

2.2.2. Uruchamianie 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

2.2.3. Uruchamianie długich programów

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.

2.2.4. Wykonywalne programy 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.)

2.2.5. Komentarze w programach awk

Komentarz 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!'

2.3. Bardzo prosty przykład

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.

2.4. Przykład z dwiema regułami

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ł.

2.5. Bardziej złożony przykład

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.

2.6. Instrukcje 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.

2.7. Inne cechy 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.

2.8. Kiedy stosować 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.

 
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.