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,$2itd.) 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 wierszaNF- liczba pól w bieżącym wierszuNR- numer bieżącego wiersza w całym wejściuFS- 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 wierszaEND- 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 tekstprintf- formatowane wypisywanie danychlength()- długość łańcuchasubstr()- podłańcuchsplit()- podział łańcucha na tablicęgsub()- globalna zamiana wzorca w łańcuchusystem()- 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
- The Grymoire Awk Tutorial - obszerny tutorial po angielsku
- GNU Awk User's Guide - oficjalna dokumentacja GNU Awk