AWK
Ogólna struktura programu
- Program w AWK to sekwencja następujących wpisów:
wzorzec { akcja }
- Jeśli wpis pozbawiony jest wzorca, dopasowuje się do każdej linii tekstu
- Jeśli wpis pozbawiony jest akcji, wypisuje całą dopasowaną linię
- Specjalny wzorzec BEGIN wykonuje się przed wczytaniem dokumentu
- Analogicznie wzorzec END wykonuje się po wczytaniu całości
Zasada działania
- AWK analizuje tekst linia po linii
- Każda wczytana linia przechodzi przez wszystkie wzorce od góry do dołu
- Jeśli nastąpiło dopasowanie, wykonana zostanie akcja, po czym następuje powrót do porównywania z innymi wzorcami! (Ważne konsekwencje: pojedyncza linia może dopasować się wielokrotnie oraz kolejność reguł w pliku AWK ma znaczenie)
- Każda linia dzielona jest na numerowane pola oddzielone dowolną liczbą białych znaków
- Pola dostępne są przez użycie znaku dolara np.:
- $1, pierwsze słowo
- $i, słowo o indeksie takim jakie ma zmienna i
- $0, cała linia niepodzielona na pola
Wzorce
- Składnia jest taka jak w wyrażeniach warunkowych instrukcji if z języka C:
- Operatory relacyjne: <, <=, !=, ==, >, >=
- Logiczne łączenie wyrażeń: &&, ||
- Można budować wyrażenia: *, /, %, +, -
- Dodatki względem C:
- Operator potęgowania: ^
- Operator dopasowania do wyrażenia regularnego: ~ (jego zaprzeczenie !~)
- Przykłady:
-
$1 == "text"
-
$1 * $2 < 10
-
($1 < $2) && ($2 < $3)
-
$1 ~ /[[:digit:]]/
-
$1 ~ /a+/
-
Instrukcje
- W AWK można korzystać ze zmiennych:
- Nie trzeba ich nigdzie deklarować
- Po prostu jak pojawi się po raz pierwszy zmienna w programie to od tego momentu istnieje
- Zmienne nie mają stałych typów; to czym jest zmienna zależy od tego co się do niej wpisze: napis, liczba całkowita czy rzeczywista to wszystko jedno w AWK
- W każdym programie można odczytać specjalne, wbudowane zmienne, których wartości ustalane są automatycznie przez procesor AWK:
- NF: liczba pól w danej linii
- NR: numer linii
- Instrukcje zapożyczone z C: if, while, do..while, for
- Instrukcja print, która wypisuje daną bez potrzeby podawania typu odgórnie
- Wbudowane funkcje:
- Związane z napisami:
-
sub(ere, repl, in)
- wejście:
Ala ma kota
- kod:
{ sub(/Ala/, "Ela", $0); print $0 }
- wyjście:
Ela ma kota
- wejście:
-
gsub(ere, repl, in)
- wejście:
napis-oddzielony-myslnikami
- kod:
{ gsub(/-/, ".", $0); print $0 }
- wyjście:
napis.oddzielony.myslnikami
- wejście:
-
index(s, t)
- wejście:
Odpowiedz brzmi: TAK
- kod:
{ print index($0, "brzmi:") }
- wyjście:
11
- wejście:
-
substr(s, m, n)
- wejście:
wprowadzenie do informatyki
- kod:
{ print substr($3, 2, 5) }
- wyjście:
nform
- wejście:
-
length(s)
-
match(s, ere)
-
split(s, a, fs)
-
tolower(s)toupper(s)
-
- Arytmetyczne:
-
atan2(y,x)
-
cos(x)
-
sin(x)
-
exp(x)
-
log(x)
-
sqrt(x)
-
int(x)
-
rand()
-
- Związane z napisami:
Przykłady
Model CPU
cpuinfo.awk
- $1 == "model" && $2 == "name" {
- text = $4
- for (i = 5; i <= NF; i++) {
- text = text " " $i
- }
- print text
- }
$ cat /proc/cpuinfo | awk -f cpuinfo.awk
Intel(R) Core(TM) i5 CPU M 580 @ 2.67GHz
Intel(R) Core(TM) i5 CPU M 580 @ 2.67GHz
Zbieranie linków ze strony WWW
links.awk
- /<a.*href=".*"/ {
- m = index($0, "href=\"")
- text = substr($0, m + 6)
- n = index(text, "\">")
- text = substr(text, 1, n - 1)
- print text
- }
$ curl www2.cs.put.poznan.pl | awk -f links.awk
http://www2.cs.put.poznan.pl/about-institute/
http://www2.cs.put.poznan.pl/pracownicy/
http://www2.cs.put.poznan.pl/zaklady/
http://www2.cs.put.poznan.pl/konferencje/
...
http://www2.cs.put.poznan.pl/about-institute/
http://www2.cs.put.poznan.pl/pracownicy/
http://www2.cs.put.poznan.pl/zaklady/
http://www2.cs.put.poznan.pl/konferencje/
...