Użycie awk w linii komend:

awk [opcje] 'skrypt' plik...
cat plik | awk [opcje] 'skrypt'

Skrypt awk składa się z wzorców i działań (poleceń) wykonywanych na liniach pliku pasujących do wzorca.
odpowiadające mu działanie.

Ogólna składnia skryptu awk to:

pattern { action }

Przykład:

awk '/pattern/ { print $0 }' file.txt

wypisze wszystkie linie z pliku file.txt zawierające słowo „pattern”.

Procedura działania awk:

  1. Wczytanie linii z pliku wejściowego (lub standardowego wejścia)
  2. Podzielenie linii na pola ($1, $2, itd.) według separatora (domyślnie biały znak)
  3. Sprawdzenie, czy linia pasuje do któregoś ze wzorców
  4. Wykonanie odpowiadającego działania na linii (jeśli pasuje)
  5. Przejście do następnej linii i powtórzenie procesu

Zmienne w awk:

  • $0 - cała linia wejściowa
  • $1, $2, … - poszczególne pola linii
  • NF - liczba pól w bieżącej linii
  • NR - numer bieżącej linii w całym wejściu
  • FS - separator pól (domyślnie biały znak)
  • OFS - separator pól przy wydruku (domyślnie biały znak)
  • RS - separator rekordów (domyślnie nowa linia)
  • ORS - separator rekordów przy wydruku (domyślnie nowa linia)

Wzorzec

  • /pattern/ - linia pasująca do wzorca (wyrażenia regularnego)
  • BEGIN - działanie wykonywane przed przetwarzaniem pierwszej linii
  • END - działanie wykonywane po przetworzeniu wszystkich linii
  • warunek logiczny (np. $1 > 10) - linia spełniająca warunek
  • dopasowanie wzorca do zmiennej (np. $1 ~ /pattern/)

Przykłady:
Numerowanie linii w pliku:

awk '{ print NR, $0 }' file.txt

Wypisanie drugiego pola każdej linii:

awk '{ print $2 }' file.txt

Zsumowanie wartości w pierwszym polu:

awk '{ sum += $1 } END { print sum }' file.txt

Wypisanie nazw zwykłych użytkowników z pliku /etc/passwd:

awk -F: '$3 >= 1000 { print $1 }' /etc/passwd

Wypisanie numerów UID uzytkoników z nazwami zaczynającymi się na „a”:

awk -F: '$1 ~ /^a/ { print $3 }' /etc/passwd

Najważniejsze opcje awk:

Opcja Opis
-F ustawienie separatora pól (domyślnie biały znak)
-v przypisanie wartości zmiennej przed rozpoczęciem przetwarzania pliku
  • print - wypisuje określone pola lub tekst
  • printf - formatowany wypis danych
  • length() - długość łańcucha
  • substr() - podłańcuch
  • split() - podział łańcucha na tablicę
  • gsub() - globalna zamiana wzorca w łańcuchu
  • system() - wykonanie polecenia systemowego
  • instrukcje warunkowe (if, else) jak w c
  • pętle (for, while) jak w c
  • operacje arytmetyczne i logiczne jak w c
  • obliczenia w precyzji zmiennoprzecinkowej, funkcje matematyczne (sin(), cos(), sqrt(), itp.)
  • tablice, także tablice asocjacyjne

Wypisanie pierwszych 10 linii pliku:

awk 'NR <= 10 { print $0 }' file.txt
awk 'NR > 10 { exit } { print $0 }' file.txt

Wypisanie linii zawierających „error”:

awk '/error/ { print $0 }' logfile.txt

Usunięcie pustych linii z pliku:

awk 'NF > 0 { print $0 }' file.txt

Zamiana „foo” na „bar” w pliku:

awk '{ gsub("foo", "bar"); print $0 }' file.txt

Zamiana małych liter na wielkie:

awk '{ for(i=1;i<=NF;i++) $i = toupper($i); print $0 }' file.txt

Wypisz liczbę linii, wyrazów i znaków w pliku:

awk '{ words += NF; chars += length($0) + 1 } END { print NR, words, chars }' file.txt