A A A
logo2




AWK jest językiem interpretowanym, którego główną funkcją jest przetwarzanie danych. Nazwa pochodzi od nazwisk jego twórców Alfreda V. Aho, Petera Weinbergera i Briana Kernighana. Wykonywanie tego skryptu polega na przetwarzaniu danych tekstowych linia po linii i stosowaniu do nich określonych akcji. Każda linia dzielona jest przez skrypt na pola (domyślnie separatorem jest spacja lub tabulator). Zmienna $0 oznacza całą linię, natomiast $1 pierwsze pole, $2 drugie pole itd.


Wywoływanie skryptu



Skrypt może zostać wywołany na dwa sposoby:


Wpisując bezpośrednio w linii poleceń treść skryptu oraz podając nazwę pliku z danymi:

owi@laptop:~$ awk 'tresc skryptu' dane

dane – plik z danymi



Zapisując skrypt w osobnym pliku:

owi@laptop:~$ awk -f skrypt dane

skrypt- plik ze skryptem
dane – plik z danymi



Budowa skryptu



wzorzec {akcja }

Część wzorzec odpowiada za to, które linie będą brane pod uwagę. Natomiast część akcja odpowiada za to w jaki sposób zostaną one przetworzone. Jeżeli nie będzie części wzorzec akcja wykona się dla każdej linii. Natomiast jeżeli nie zdefiniowano akcji wybrane linie zostaną jedynie wyświetlone, ponieważ domyślną akcją jest akcja drukuj linie.


Przykład 1

treść skryptu:


owi@laptop:~$ awk '{printf $0}' dane

Ponieważ w treści skryptu brakuje wzorca skrypt wykona się dla każdej linii. Na ekranie zostanie wypisana każda linia z pliku dane.



Przykład 2
treść skryptu:


owi@laptop:~$ awk '$2>10' dane

Brakuje akcji więc zostaną wyświetlone tylko te linie w których w drugiej kolumnie znajduje się wartość wieksza niż 10.



Przykład 3

treść skryptu:

owi@laptop:~$ awk '$2>10 {printf $1}' dane

Tym razem jest zarówno akcja jak i wzorzec. Wzorzec mówi, że pod uwagę będą brane jedynie te linie w których wartość w drugiej kolumnie jest większa od 10 natomiast akcja z tych linii wypiszę jedynie pierwszą kolumnę z pliku dane.



Przykład 4

treść skryptu:

owi@laptop:~$ awk '$1==”ala” {printf $2}' dane

Dla linii w których w pierwszej kolumnie znajduje się słowo ala zostanie wypisana druga kolumna.


BEGIN i END
Skrypt jest wykonywany dla określonych we wzorcu linii pliku dane. Aby pewna czynność została wykonana na samym początku przed zinerpretowaniem pierwszej linii należy użyć dyrektywy BEGIN.



Przykład 5

BEGIN można użyć aby dodać nagłówek.
owi@laptop:~$ awk 'BEGIN { print "login" ,"liczba"} $4>10 {print $1,$2}' dane

Na samym początku pojawi się tekst „login liczba”, a następnie zostanie wykonane polecenie $4>10 {print $1,$2}.


Zmienne
Znajduje się kilka takich zmiennych wbudowanych w język, których inicjowane są automatycznie np: NR-liczba aktualnie przetwarzanej linii, FS-separator pól, NF - liczba pól w bieżącej linii.



Przykład 6

W pliku /etc/passwd znajdują dane, których kolumny nie są oddzielone, ani spacjami, ani tabulatorami, a znakami „:”. Aby wypisać z nich przykładowo 2 kolumnę trzeba więc przed przetworzeniem pierwszej linii dać sygnał, że separatorem między kolumnami jest znak „ : ”. Do zmiany separatora posłuży zmienna FS.
owi@laptop:~$ awk 'BEGIN { FS=":" } $3>100 {print $1}' /etc/passwd

Analogicznie do BEGIN działa END z tym, że wykonuje on polecenia na końcu działania skryptu.


Przykład 7

Zmienna NR mówi w której wypisanej linii obecnie się znajduje. Używając go w END zostanie wypisana ilość wszystkich linii.
owi@laptop:~$ awk '$2>1 {print $1,$2} END{print "Jest lini:" NR-1}' dane




Instrukcje warunkowe:



If
Instrukcja warunkowa if wygląda identycznie jak w języku C tzn.:

if (warunek) { ... } else { ... }




Przykład 8

owi@laptop:~$ awk '{print $0} END { if(NR>10) print "Dużo linii"; else print "Mało linii"}' dane

Powyższy skrypt spowoduje wypisanie na końcu tekstu „mało linii” gdy gdy liczba linii będzie mniejsza od 10 lub „dużo linii” gdy będzie większa.


Autor: Aleksandra Przybyło
aleksandraprzybylo@gmail.com