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:
$1, $2, itd.) według separatora (domyślnie biały znak) Zmienne w awk:
$0 - cała linia wejściowa$1, $2, … - poszczególne pola liniiNF - liczba pól w bieżącej liniiNR - numer bieżącej linii w całym wejściuFS - 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 liniiEND - działanie wykonywane po przetworzeniu wszystkich linii$1 > 10) - linia spełniająca warunek$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 |
print - wypisuje określone pola lub tekstprintf - formatowany wypis danychlength() - długość łańcuchasubstr() - podłańcuchsplit() - podział łańcucha na tablicęgsub() - globalna zamiana wzorca w łańcuchusystem() - wykonanie polecenia systemowegoif, else) jak w cfor, while) jak w csin(), cos(), sqrt(), itp.)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