===== AWK / GAWK / NAWK =====
**Użycie awk w wierszu poleceń:**
awk [opcje] 'skrypt' plik...
cat plik | awk [opcje] 'skrypt'
Skrypt awk składa się ze wzorców i działań (poleceń), które są wykonywane dla wierszy pasujących do danego wzorca.
Ogólna składnia skryptu awk to:
pattern { action }
Przykład:
awk '/pattern/ { print $0 }' file.txt
wypisze wszystkie wiersze z pliku ''file.txt'' zawierające słowo "pattern".
**Procedura działania awk:**
- Wczytanie wiersza z pliku wejściowego (lub ze standardowego wejścia)
- Podzielenie wiersza na pola (''$1'', ''$2'' itd.) według separatora (domyślnie białe znaki)
- Sprawdzenie, czy wiersz pasuje do któregoś ze wzorców
- Wykonanie odpowiadającego działania dla pasującego wiersza
- Przejście do następnego wiersza i powtórzenie procesu
**Zmienne w awk:**
* ''$0'' - cały bieżący wiersz wejściowy
* ''$1'', ''$2'', ... - poszczególne pola wiersza
* ''NF'' - liczba pól w bieżącym wierszu
* ''NR'' - numer bieżącego wiersza w całym wejściu
* ''FS'' - separator pól (domyślnie białe znaki)
* ''OFS'' - separator pól przy wypisywaniu (domyślnie spacja)
* ''RS'' - separator rekordów (domyślnie znak nowej linii)
* ''ORS'' - separator rekordów przy wypisywaniu (domyślnie znak nowej linii)
**Wzorce**
* ''/pattern/'' - wiersz pasujący do wzorca (wyrażenia regularnego)
* ''BEGIN'' - działanie wykonywane przed przetwarzaniem pierwszego wiersza
* ''END'' - działanie wykonywane po przetworzeniu wszystkich wierszy
* warunek logiczny (np. ''$1 > 10'') - wiersz spełniający warunek
* dopasowanie wzorca do zmiennej (np. ''$1 ~ /pattern/'')
Przykłady: \\
Numerowanie wierszy w pliku:
awk '{ print NR, $0 }' file.txt
Wypisanie drugiego pola każdego wiersza:
awk '{ print $2 }' file.txt
Zsumowanie wartości w pierwszym polu:
awk '{ sum += $1 } END { print sum }' file.txt
Wypisanie nazw użytkowników z pliku /etc/passwd:
awk -F: '$3 >= 1000 { print $1 }' /etc/passwd
Wypisanie numerów UID użytkowników o nazwach zaczynających 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'' - formatowane wypisywanie 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''), podobne do dostępnych w języku C
* pętle (''for'', ''while''), podobne do dostępnych w języku C
* operacje arytmetyczne i logiczne, podobne do dostępnych w języku C
* obliczenia zmiennoprzecinkowe i funkcje matematyczne (''sin()'', ''cos()'', ''sqrt()'' itp.)
* tablice, w tym tablice asocjacyjne
==== Przykłady użycia ====
Wypisanie pierwszych 10 wierszy pliku:
awk 'NR <= 10 { print $0 }' file.txt
awk 'NR > 10 { exit } { print $0 }' file.txt
Wypisanie wierszy zawierających "error":
awk '/error/ { print $0 }' logfile.txt
Usunięcie pustych wierszy 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
Wypisanie liczby wierszy, 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]]