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 wierszu poleceń:** <code>awk [opcje] 'skrypt' plik...</code> <code>cat plik | awk [opcje] 'skrypt'</code> 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: <code>pattern { action }</code> Przykład: <code>awk '/pattern/ { print $0 }' file.txt</code> 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: <code>awk '{ print NR, $0 }' file.txt</code> Wypisanie drugiego pola każdego wiersza: <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 użytkowników z pliku /etc/passwd: <code>awk -F: '$3 >= 1000 { print $1 }' /etc/passwd</code> Wypisanie numerów UID użytkowników o nazwach zaczynających 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'' - 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: <code>awk 'NR <= 10 { print $0 }' file.txt</code> <code>awk 'NR > 10 { exit } { print $0 }' file.txt</code> Wypisanie wierszy zawierających "error": <code>awk '/error/ { print $0 }' logfile.txt</code> Usunięcie pustych wierszy 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> Wypisanie liczby wierszy, 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]]