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:

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)
        in to wejściowy napis (np. cała linia $0), ere to szukane wyrażenie regularne, repl to napis, który zastąpi pierwsze dopasowanie. Przykład:
        • wejście: Ala ma kota
        • kod: { sub(/Ala/, "Ela", $0); print $0 }
        • wyjście: Ela ma kota
      • gsub(ere, repl, in)
        analogicznie jak sub(), ale zastąpi każde dopasowanie. Przykład:
        • wejście: napis-oddzielony-myslnikami
        • kod: { gsub(/-/, ".", $0); print $0 }
        • wyjście: napis.oddzielony.myslnikami
      • index(s, t)
        wyszukuje w s napisu t, zwraca indeks pierwszego znaku, który pasuje. Przykład:
        • wejście: Odpowiedz brzmi: TAK
        • kod: { print index($0, "brzmi:") }
        • wyjście: 11
      • substr(s, m, n)
        z napisu s wyciągnij podciąg znaków zaczynający się od m i będący o długości maksymalnie n (jeśli n pominięte, to napis zaczynający się od m i trwający do końca). Przykład:
        • wejście: wprowadzenie do informatyki
        • kod: { print substr($3, 2, 5) }
        • wyjście: nform
      • length(s)
        długość napisu s
      • match(s, ere)
        wyszukuje wzorca ere w napisie s, zwraca indeks pierwszego znaku, który pasuje
      • split(s, a, fs)
        dzieli napis s wg znaku fs na oddzielne pola; wynik trafia do tablicy a
      • tolower(s)
        toupper(s)
        zwróć napis s z małymi / wielkimi literami
    • Arytmetyczne:

Przykłady

Model CPU

cpuinfo.awk
  1. $1 == "model" && $2 == "name" {
  2.     text = $4
  3.     for (i = 5; i <= NF; i++) {
  4.         text = text " " $i
  5.     }
  6.     print text
  7. }
$ cat /proc/cpuinfo | awk -f cpuinfo.awk
Intel(R) Core(TM) i5 CPU M 580 @ 2.67GHz

Zbieranie linków ze strony WWW

links.awk
  1. /<a.*href=".*"/ {
  2.     m = index($0, "href=\"")
  3.     text = substr($0, m + 6)
  4.     n = index(text, "\">")
  5.     text = substr(text, 1, n - 1)
  6.     print text
  7. }
$ 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/
...