Home Dokumentacje Efektywne programowanie w AWK - Podręcznik użytkownika GNU awk - Uruchamianie awk
08 | 12 | 2019
Efektywne programowanie w AWK - Podręcznik użytkownika GNU awk - Uruchamianie awk Drukuj

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

 


 

14. Uruchamianie awk

Istnieją dwie metody uruchamiania awk: z programem podanym wprost, albo z jednym czy więcej plikami programów. Oto szablony obu; elementy zawarte w `[...]' są w nich opcjonalne.

Oprócz tradycyjnych jednoliterowych opcji w stylu POSIX, gawk rozpoznaje także długie opcje GNU.

awk [opcje] -f plikprog [--] plik ...
awk [opcje] [--] 'program' plik ...

Możliwe jest wywołanie awk z pustym programem:

$ awk '' plikdanych1 plikdanych2

Nie ma to jednak większego sensu: awk po prostu milcząco zakończy pracę gdy otrzyma pusty program (c.k.). Jeżeli w wierszu poleceń podano opcję `--lint', gawk wyśle ostrzeżenie, że program jest pusty.

14.1. Opcje wiersza poleceń

Opcje rozpoczynają się kreską, i składają się z pojedynczego znaku. Długie opcje w stylu GNU składają się z dwu kresek i słowa kluczowego. Słowa kluczowe można skracać, dopóki skrót pozwala na unikalną, jednoznaczną identyfikację opcji. Jeśli opcja pobiera argument, to albo bezpośrednio po słowie kluczowym występuje znak równości (`=') i wartość argumentu, albo słowo kluczowe i wartość oddzielone są białym znakiem. W celu zachowania zwięzłości, poniższe omówienie odnosi się tylko do tradycyjnych, krótkich opcji; długie i krótkie opcje są jednak we wszystkich kontekstach wzajemnie wymienne.

Każda z długich opcji gawk ma odpowiadającą jej opcję w stylu POSIX. Opcje i ich znaczenie są następujące:

-F fs
--field-separator fs
Nadaje zmiennej FS wartość fs (zob. 5.5. Jak rozdzielać pola).
-f plik-źródłowy
--file plik-źródłowy
Wskazuje, że programu awk należy szukać w pliku-źródłowym zamiast w pierwszym nie-opcyjnym argumencie.
-v zmn=wart
--assign zmn=wart
Nadaje zmiennej zmn wartość wart przed rozpoczęciem wykonywania programu. Takie wartości zmiennych są dostępne w regule BEGIN (zob. 14.2. Inne argumenty wiersza poleceń). Opcja `-v' może nadać wartość tylko jednej zmiennej, ale można ją zastosować więcej niż raz, za każdym razem przypisując wartość innej zmiennej, jak np.: `awk -v foo=1 -v bar=2 ...'. Uwaga! Wykorzystanie `-v' do nadania wartości zmiennym wbudowanym może prowadzić do zaskakujących rezultatów. awk ponownie nada wartości tym zmiennym, gdy będzie tego potrzebował, prawdopodobnie ignorując wszelkie predefiniowane wartości, jakie podaliśmy.
-mf NNN
-mr NNN
Przypisuje rozmaitym limitom pamięci wartość NNN. Flaga `f' ustala maksymalną liczbę pól, a `r' maksymalny rozmiar rekordu. Te dwie flagi i opcja `-m' pochodzą z awk w wersji Bell Labs research. Pozostawiono je w celu zachowania zgodności, ale poza tym są przez gawk ignorowane, gdyż gawk nie ma żadnych predefiniowanych ograniczeń.
-W opcje-gawk
Zgodnie ze standardem POSIX, opcje specyficzne dla danej implementacji podawane są jako argumenty opcji `-W'. Opcje te również mają odpowiedniki w postaci długich opcji w stylu GNU. Zobacz niżej.
--
Sygnalizuje koniec opcji wiersza poleceń. Następne argumenty nie są traktowane jak opcje, nawet jeśli zaczynają się od `-'. Taka interpretacja `--' jest zgodna z POSIX-ową konwencją przetwarzania argumentów. Jest przydatna jeśli mamy pliki o nazwach zaczynających się od `-', albo w skryptach powłoki, jeśli mamy nazwy plików podawane przez użytkownika, który może zacząć od `-'.

Dostępne są następujące opcje specyficzne dla gawk:

-W traditional
-W compat
--traditional
--compat
Określa tryb zgodności, w którym rozszerzenia GNU języka awk są wyłączone, tak że gawk zachowuje się całkiem jak wersja uniksowego z awk Bell Labs research. Zalecaną postacią tej opcji jest `--traditional'. Zob. 17.5. Rozszerzenia gawk poza POSIX awk, podsumowujące rozszerzenia. Zobacz także C.1. Zgodność w dół i debuggowanie.
-W copyleft
-W copyright
--copyleft
--copyright
Wypisuje krótką wersję Powszechnej Licencji Publicznej (General Public License), a następnie kończy pracę. Ta opcja może zniknąć w przyszłych wersjach gawk.
-W help
-W usage
--help
--usage
Wypisuje komunikat o "sposobie użycia", podsumowujący krótkie i długie opcje akceptowane przez gawk, a następnie kończy pracę.
-W lint
--lint
Ostrzega o konstrukcjach niepewnych czy nieprzenośnych do innych implementacji awk. Niektóre z ostrzeżeń emitowane są gdy gawk po raz pierwszy czyta program. Inne wysyłane są w czasie wykonania, podczas działania programu.
-W lint-old
--lint-old
Ostrzega o konstrukcjach, które nie są dostępne w pierwotnej wersji awk z Version 7 Unix (zob. 17.1. Główne różnice między V7 a SVR3.1).
-W posix
--posix
Działa w trybie ścisłej zgodności z POSIX. Wyłącza to wszystkie rozszerzenia gawk (tak samo jak `--traditional'), i nakłada następujące dodatkowe ograniczenia: Jeżeli w wierszu poleceń zostanie podane zarówno `--traditional' jak i `--posix', to `--posix' ma pierwszeństwo. Jeśli podano obie te opcje, gawk wyśle też ostrzeżenie.
-W re-interval
--re-interval
Dopuszcza wyrażenia przedziałowe (interval expressions) (zob. 4.3. Operatory wyrażeń regularnych), w wyrażeniach regularnych. Ponieważ wyrażenia przedziałowe tradycyjnie nie były dostępne w awk, gawk domyślnie ich nie zapewnia. Chroni to stare programy awk przed błędnym działaniem.
-W source tekst-programu
--source tekst-programu
Kod źródłowy pobierany jest z tekst-programu. Opcja ta umożliwia używanie kodu źródłowego z plików równocześnie z kodem wprowadzonym w wierszu poleceń. Jest to szczególnie użyteczne gdy mamy funkcje biblioteczne, które chcielibyśmy wykorzystać w programach wpisanych w wierszu poleceń (zob. 14.3. Zmienna środowiska AWKPATH).
-W version
--version
Wypisuje informację o wersji tego konkretnego egzemplarza gawk. Umożliwia to ustalenie, czy nasza kopia gawk jest aktualna w stosunku do tego, co obecnie rozpowszechnia Free Software Foundation. Przydatne także przy zgłoszeniach błędów (zob. B.7. Zgłaszanie problemów i błędów).

Wszystkie inne opcje znakowane są jako niepoprawne i wysyłany jest komunikat ostrzegawczy. Poza tym są ignorowane.

W trybie zgodności, jeśli wartością fs przekazaną opcji `-F' jest `t', to traktowane jest to jako przypadek szczególny, i FS zostaje nadana wartość znaku tabulacji ("\t"). Jest to prawdziwe tylko dla opcji `--traditional', ale nie dla `--posix' (zob. 5.5. Jak rozdzielać pola).

Opcji `-f' można użyć w wierszu poleceń więcej niż raz. Jeżeli wystąpi ona więcej niż raz, to, awk czyta źródło programu ze wszystkich wymienionych plików, tak jakby były one złączone w jeden duży plik. Przydaje się to do tworzenia bibliotek funkcji awk. Użyteczne funkcje można napisać raz, a następnie wczytywać ze standardowego miejsca, zamiast konieczności włączania ich do każdego poszczególnego programu.

Można wpisywać program na terminalu i nadal używać funkcji bibliotecznych, podając `-f /dev/tty'. awk będzie czytał z terminala plik, który ma być użyty jako część programu awk. W celu zakończenia pisania programu, po wpisaniu treści naciskamy Control-d (znak końca pliku). (Można też wykorzystać `-f -' do odczytu źródła programu ze standardowego wejścia, ale wówczas nie będzie można równocześnie użyć standardowego wejścia jako źródła danych.)

Ponieważ korzystanie ze standardowych mechanizmów awk do łączenia programów awk z pliku źródłowego i z wiersza poleceń jest nieporęczne, gawk udostępnia opcję `--source'. Nie wymaga ona zawłaszczania standardowego wejścia dla kodu źródłowego i pozwala na łatwe łączenie kodu źródłowego z wiersza poleceń i bibliotek. (zob. 14.3. Zmienna środowiska AWKPATH).

Jeżeli nie podano `-f' ani `--source', to gawk jako tekstem kodu źródłowego programu posłuży się pierwszym nie będącym opcją argumentem wiersza poleceń.

Jeśli istnieje zmienna środowiska POSIXLY_CORRECT, to gawk będzie działać w trybie ścisłej zgodności z POSIX, dokładnie tak, jakby w linii poleceń podano opcję `--posix'. Wiele programów GNU szuka tej zmiennej środowiska, by włączyć tryb pełnej zgodności z POSIX. Jeżeli w wierszu poleceń podano `--lint', a gawk włącza tryb zgodności z POSIX z powodu POSIXLY_CORRECT, to wypisze komunikat ostrzegawczy wskazujący, że w rezultacie działa tryb POSIX.

Standardowo zmienną tę ustala się w prywatnym pliku uruchomieniowym powłoki. Dla powłoki zgodnej z powłoka Bourne'a (jak Bash), do pliku `.profile' w swoim katalogu domowym dopisuje się poniższe wiersze:

POSIXLY_CORRECT=true
export POSIXLY_CORRECT

Dla powłoki zgodnej z csh,(18) do pliku `.login' w swoim katalogu domowym należy dodać taki wiersz:

setenv POSIXLY_CORRECT true

14.2. Inne argumenty wiersza poleceń

Ewentualne dodatkowe argumenty wiersza poleceń są normalnie traktowane jako pliki wejściowe, które mają zostać przetworzone w podanej kolejności. Jednak argument mający postać zmn=wart, przypisuje wartość wart zmiennej zmn -- wcale nie określa pliku.

Wszystkie te argumenty udostępniane są naszemu programowi awk w tablicy ARGV (zob. 10. Zmienne wbudowane). Opcje wiersza poleceń i tekst programu (jeśli jest) są ARGV opuszczane. Wszystkie inne argumenty, łącznie z przypisaniami zmiennych są dołączane. Podczas przetwarzania każdego elementu ARGV, gawk nadaje zmiennej ARGIND wartość indeksu w ARGV, pod którym umiejscowiony jest bieżący element.

Argumenty opisujące nazwy plików odróżniane są od argumentów przypisań zmiennych gdy awk ma otworzyć następny plik wejściowy. W tym momencie wykonywania, sprawdza on "nazwę pliku", by stwierdzić czy nie jest to faktycznie przypisanie do zmiennej. Jeśli tak, to awk nadaje wartość zmiennej zamiast czytać plik.

Z tego powodu, zmienne w rzeczywistości otrzymują zadane wartości po przeczytaniu wszystkich podanych przed nimi plików. W szczególności, wartości zmiennych przypisane w ten sposób nie są dostępne w regule BEGIN (zob. 8.1.5. Wzorce specjalne BEGIN i END), gdyż reguły te są uruchamiane zanim awk zacznie badać listę argumentów.

Wartości zmiennych podanych w wierszu poleceń są przetwarzane co do występowania sekwencji specjalnych (c.k.) (zob. 4.2. Sekwencje specjalne).

W niektórych wcześniejszych implementacjach awk, gdy przypisanie zmiennej wystąpiło przed wszystkimi nazwami plików, przypisanie to następowało przed wykonaniem reguły BEGIN. Zachowanie się awk było zatem niespójne; niektóre przypisania wiersza poleceń były dostępne w regule BEGIN, podczas gdy inne nie. Niektóre aplikacje zaczęły jednak polegać na tej "możliwości". Gdy zmieniano awk tak, by był bardziej spójny, w celu przystosowania aplikacji zależnych od starego zachowania dodano opcję `-v'.

Funkcja przypisywania zmiennych jest najprzydatniejsza do nadawania wartości takim zmiennym jak RS, OFS i ORS, sterujących formatami wejściowymi i wyjściowymi, przed przeglądaniem plików wejściowych. Jest też użyteczna przy sterowaniu stanem jeśli dla jakiegoś pliku danych potrzebujemy wielu przebiegów. Na przykład:

awk 'przeb == 1  { obsługa 1 przebiegu }
     przeb == 2  { obsługa 2 przebiegu }'
       przeb=1 mojedane przeb=2 mojedane

Ponieważ mamy funkcję przypisywania zmiennych, do nadawania wartości FS w ogóle nie jest konieczna opcja `-F'. Pozostaje w celu utrzymania historycznej zgodności.

14.3. Zmienna środowiska AWKPATH

Poprzednia sekcja opisywała, w jaki sposób opcją `-f' można podawać nazwy plików programów awk w wierszu poleceń. W większości implementacji awk musimy podać dokładną ścieżkę dla każdego pliku z programem, chyba że jest on w katalogu bieżącym.

Jednak w gawk, jeśli nazwa pliku dostarczona opcji `-f' nie zawiera `/', to gawk przegląda po kolei katalogi z listy katalogów (zwanej ścieżką wyszukiwania), szukając w nich pliku o podanej nazwie.

Ścieżka wyszukiwania jest łańcuchem składającym się z oddzielonych dwukropkami nazw katalogów. gawk bierze swoją ścieżkę wyszukiwania ze zmiennej środowiska AWKPATH. Jeżeli zmienna ta nie istnieje, to stosuje ścieżkę domyślną, którą jest `.:/usr/local/share/awk'.(19) (Programy napisane dla administratorów systemu powinny używać zmiennej AWKPATH, która nie zawiera katalogu bieżącego, `.'.)

Funkcja ścieżki wyszukiwania jest szczególnie przydatna przy tworzeniu bibliotek użytecznych funkcji awk. Pliki bibliotek można umieścić w standardowym katalogu, będącym w ścieżce domyślnej, a następnie podać w wierszu poleceń za pomocą krótkiej nazwy pliku. W przeciwnym razie, dla każdego pliku musiałaby być wpisana pełna nazwa pliku.

Własne programy awk z wiersza poleceń mogą korzystać ze wspomagających plików bibliotecznych używając równocześnie opcji `--source' i `-f'. Zob. 15. Biblioteczka funkcji awk.

Przeszukiwanie ścieżki nie jest wykonywane gdy gawk pracuje w trybie zgodności. Jest to prawdą zarówno dla `--traditional' jak i dla `--posix'. Zob. 14.1. Opcje wiersza poleceń.

Zauważ: jeśli chcemy, by zostały znalezione pliki w bieżącym katalogu, musimy ująć go w ścieżce, albo przez umieszczenie w niej jawnie katalogu `.', albo przez zapisanie w niej pustej pozycji. (Pusta pozycja jest wskazywana przez rozpoczęcie lub zakończenie ścieżki dwukropkiem lub przez umieszczenie obok siebie dwóch dwukropków (`::').) Jeżeli bieżącego katalogu nie ujęto w ścieżce, to plików nie można znaleźć w bieżącym katalogu. Ten mechanizm ścieżki wyszukiwania jest identyczny jak występujący w powłoce.

Począwszy od wersji 3.0, jeśli w środowisku nie ma zdefiniowanej AWKPATH, gawk umieści w ENVIRON["AWKPATH"] swoją domyślną ścieżkę wyszukiwania. Ułatwia to ustalenie ścieżki wyszukiwania, jaką posłuży się gawk.

14.4. Przestarzałe opcje i/lub cechy

Ta sekcja opisuje cechy i/lub opcje wiersza poleceń z poprzednich wersji gawk, które albo nie są dostępne w obecnej wersji albo są nadal obsługiwane, lecz niezalecane (co znaczy, że nie będzie ich w kolejnym wydaniu).

W wersji 3.0.6 gawk, nie ma opcji wiersza poleceń ani innych niezalecanych cech z poprzednich wersji gawk.

Ta sekcja jest więc w gruncie rzeczy wypełniaczem, rezerwującym miejsce na wypadek gdyby w którejś następnej wersji gawk jakieś opcje stały się przestarzałe.

14.5. Nieudokumentowane opcje i cechy

Use the Source, Luke!
Obi-Wan

 

Tę sekcję celowo pozostawiono pustą.

14.6. Znane błędy gawk

  • Opcja `-F' do zmiany wartości FS (zob. 14.1. Opcje wiersza poleceń) nie jest niezbędna, gdyż mamy funkcję przypisań zmiennych w wierszu poleceń. Pozostaje tylko ze względu na zgodność wsteczną.
  • Jeżeli nasz system rzeczywiście obsługuje `/dev/fd' i skojarzone pliki `/dev/stdin', `/dev/stdout' i `/dev/stderr', to możemy uzyskać inne wyjście z awk niż otrzymalibyśmy na systemie bez tych plików. Gdy gawk interpretuje te pliki wewnętrznie, to synchronizuje wyjście na standardowe wyjście z wyjściem do `/dev/stdout', podczas gdy na systemie z tymi plikami, wyjście jest faktycznie do innych otwartych plików (zob. 6.7. Specjalne nazwy plików w gawk).
  • Składniowo niepoprawne, jednoznakowe programy mają skłonność do przepełniania stosu analizatora składni, wysyłając niezbyt pomocny komunikat. Programy takie są zaskakująco trudne do rozpoznania w przypadku całkiem ogólnym i naprawdę nie byłoby to warte włożonego wysiłku.

 


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.