===== AWK / GAWK / NAWK =====
**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:**
- Wczytanie linii z pliku wejściowego (lub standardowego wejścia)
- Podzielenie linii na pola (''$1'', ''$2'', itd.) według separatora (domyślnie biały znak)
- Sprawdzenie, czy linia pasuje do któregoś ze wzorców
- Wykonanie odpowiadającego działania na linii (jeśli pasuje)
- 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 |
==== Działania awk ====
* ''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
==== Przykłady użycia ====
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
==== Zasoby online ====
* [[https://www.grymoire.com/Unix/Awk.html|The Grymoire Awk Tutorial]] - obszerny tutorial po angielsku
* [[https://www.gnu.org/software/gawk/manual/gawk.html|GNU Awk User's Guide]] - oficjalna dokumentacja GNU Awk
* [[https://www.tutorialspoint.com/awk/index.htm|Awk Tutorial - Tutorialspoint]]