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