Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić. ===== AWK / GAWK / NAWK ===== **Użycie awk w linii komend:** <code>awk [opcje] 'skrypt' plik...</code> <code>cat plik | awk [opcje] 'skrypt'</code> 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: <code>pattern { action }</code> Przykład: <code>awk '/pattern/ { print $0 }' file.txt</code> 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: <code>awk '{ print NR, $0 }' file.txt</code> Wypisanie drugiego pola każdej linii: <code>awk '{ print $2 }' file.txt</code> Zsumowanie wartości w pierwszym polu: <code>awk '{ sum += $1 } END { print sum }' file.txt</code> Wypisanie nazw zwykłych użytkowników z pliku /etc/passwd: <code>awk -F: '$3 >= 1000 { print $1 }' /etc/passwd</code> Wypisanie numerów UID uzytkoników z nazwami zaczynającymi się na "a": <code>awk -F: '$1 ~ /^a/ { print $3 }' /etc/passwd</code> **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: <code>awk 'NR <= 10 { print $0 }' file.txt</code> <code>awk 'NR > 10 { exit } { print $0 }' file.txt</code> Wypisanie linii zawierających "error": <code>awk '/error/ { print $0 }' logfile.txt</code> Usunięcie pustych linii z pliku: <code>awk 'NF > 0 { print $0 }' file.txt</code> Zamiana "foo" na "bar" w pliku: <code>awk '{ gsub("foo", "bar"); print $0 }' file.txt</code> Zamiana małych liter na wielkie: <code>awk '{ for(i=1;i<=NF;i++) $i = toupper($i); print $0 }' file.txt</code> Wypisz liczbę linii, wyrazów i znaków w pliku: <code>awk '{ words += NF; chars += length($0) + 1 } END { print NR, words, chars }' file.txt</code> ==== 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]]