===== 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]]