1. Co to jest AWK i kiedy się przydaje?
AWK to:
- 1. Co to jest AWK i kiedy się przydaje?
- 2. Podstawowa składnia AWK
- 3. Rekordy i pola – jak AWK widzi tekst
- 4. Najprostsze użycia AWK
- 5. Zmiana separatora pól (FS) – praca z CSV i logami
- 6. Wzorce (pattern) – filtrowanie wierszy
- 7. Podstawowe akcje: print, operacje, zmienne
- 8. Najważniejsze wbudowane bloki: BEGIN i END
- 9. AWK jako „kalkulator” na plikach – kluczowe konstrukcje
- 10. Praktyka – analiza logów serwera WWW (Apache/Nginx)
- 11. Praca z plikami CSV (statystyki internetowe, kampanie)
- 12. Przetwarzanie wyników poleceń systemowych
- 13. Zaawansowane wzorce i wyrażenia regularne
- 14. Funkcje wbudowane w AWK – praktyczne dla danych internetowych
- 15. Skrypty AWK w plikach (-f) – organizacja większych „programów”
- 16. Porównanie AWK z innymi narzędziami (grep, sed)
- 17. Typowe pułapki i dobre praktyki
- 18. Mini „ściąga” – najważniejsze konstrukcje AWK
- 19. Jak zacząć uczyć się AWK (prosta instrukcja dla czytelnika)
- język przetwarzania tekstu – nazwany od nazwisk twórców: Aho, Weinberger, Kernighan;
- program linii poleceń – dostępny praktycznie w każdej dystrybucji Linuksa;
- czytanie danych wiersz po wierszu – operuje na rekordach;
- dzielenie na pola – kolumny oddzielone spacją, tabem lub przecinkiem;
- wzorzec → akcja – wykonuje działanie, gdy wiersz pasuje do wzorca.
Typowe zastosowania AWK w kontekście internetu i administrowania obejmują:
- wyciąganie kolumn z logów (np. adres IP, kod HTTP, URL z access.log),
- szybkie statystyki: liczenie żądań, sumowanie transferu, średni czas odpowiedzi serwera,
- filtrowanie wierszy (np. tylko błędy 404, tylko dany host),
- generowanie raportów z plików CSV/TSV (np. zestawienia ruchu, statystyki kampanii),
- przetwarzanie wyników poleceń (
ps,netstat,ss,df,ipitd.).
2. Podstawowa składnia AWK
2.1. Wywołanie polecenia
Najprostsza forma:
awk 'program' plik
Alternatywnie możesz czytać dane z potoku:
polecenie | awk 'program'
Program AWK składa się z reguł w postaci wzorzec { akcja }. W skrócie: wzorzec mówi, co dopasować (np. liczba w kolumnie > 100, tekst „ERROR”), a akcja określa, co zrobić (np. print wybranych pól, sumowanie, formatowanie). Reguły można oddzielać nową linią albo średnikiem ;.
Przykład działania na każdej linii i wypisania pierwszego pola:
awk '{ print $1 }' plik.txt
Brak wzorca oznacza, że akcja wykona się dla każdego wiersza; konstrukcja { print $1 } wypisze wartość pierwszego pola.
3. Rekordy i pola – jak AWK widzi tekst
AWK pracuje na rekordach (domyślnie jeden rekord to jeden wiersz tekstu) oraz na polach (domyślnie oddzielonych białymi znakami: spacja, tab).
Najważniejsze wbudowane zmienne to:
$0– cały bieżący wiersz (rekord);$1,$2, … – kolejne pola (kolumny) w danym wierszu;NF– liczba pól w bieżącym wierszu;NR– numer wiersza (rekordu) w całym wejściu;FNR– numer wiersza w aktualnym pliku (gdy jest kilka plików);FS– separator pól (Field Separator), domyślnie spacja/tab;OFS– separator pól w wyjściu (Output Field Separator).
4. Najprostsze użycia AWK
4.1. Wyświetlanie wybranych kolumn
Przykładowy plik dane.txt wygląda tak:
Jan 10 192.168.0.1
Anna 20 192.168.0.5
Piotr 15 192.168.0.8
Aby wyświetlić pierwszą kolumnę, użyj:
awk '{ print $1 }' dane.txt
Aby wyświetlić pierwszą i trzecią kolumnę z separatorem „ – ”, wpisz:
awk '{ print $1 " - " $3 }' dane.txt
Domyślnie AWK używa spacji jako separatora pól.
4.2. Numerowanie linii
Przykład numerowania wierszy wejścia:
awk '{ print NR ": " $0 }' dane.txt
5. Zmiana separatora pól (FS) – praca z CSV i logami
Wiele plików internetowych (statystyki, logi, eksporty) ma niestandardowy separator: ,, ;, |.
5.1. Opcja -F
Przykład użycia separatora przecinkowego:
awk -F, '{ print $1, $3 }' plik.csv
-F, ustawia separator pól na przecinek, a $1 i $3 oznaczają odpowiednio pierwszą i trzecią kolumnę.
5.2. Ustawienie separatora w programie AWK
Alternatywnie możesz ustawić separator w bloku BEGIN:
awk 'BEGIN { FS=";" } { print $2 }' plik.csv
Blok BEGIN wykonywany jest raz, przed przetwarzaniem danych.
6. Wzorce (pattern) – filtrowanie wierszy
Wzorce zapisujemy przed blokiem akcji { ... } i służą do selekcji rekordów.
6.1. Filtrowanie według wartości liczbowej
Oto przykładowy plik uzycie.txt:
host1 25
host2 80
host3 15
host4 100
Aby wyświetlić wiersze, gdzie druga kolumna > 50, użyj:
awk '$2 > 50 { print $1, $2 }' uzycie.txt
Wzorzec $2 > 50 oznacza: wykonaj akcję tylko, jeśli druga kolumna jest większa od 50.
6.2. Filtrowanie tekstu (dopasowanie wzorca)
AWK obsługuje wyrażenia regularne. Aby wypisać wszystkie wiersze zawierające słowo „ERROR”, wpisz:
awk '/ERROR/ { print $0 }' log.txt
W skrócie możesz pominąć { print $0 }:
awk '/ERROR/' log.txt
7. Podstawowe akcje: print, operacje, zmienne
7.1. print – wypisywanie danych
print bez argumentów wypisuje całe $0; użycie print $1, $2 wypisze wybrane pola rozdzielone domyślnym OFS (spacją).
Aby zmienić separator pól na wyjściu, użyj:
awk 'BEGIN { OFS=";" } { print $1, $2, $3 }' plik.txt
7.2. Proste operacje arytmetyczne
Przykład przemnożenia drugiej kolumny i wypisania wyniku:
awk '{ suma = $2 * 1.23; print $1, suma }' plik.txt
7.3. Własne zmienne
Zmienne możesz tworzyć „z marszu”, np. do kumulacji wartości:
awk '{ suma += $2 } END { print "Suma:", suma }' dane.txt
Blok END wykonywany jest raz, po przetworzeniu wszystkich wierszy.
8. Najważniejsze wbudowane bloki: BEGIN i END
BEGIN { ... } – kod uruchamiany raz przed czytaniem danych (np. ustawienia, nagłówek).
END { ... } – kod uruchamiany raz po przetworzeniu wszystkich wierszy (np. podsumowanie).
Przykład prostego podsumowania drugiej kolumny:
awk 'BEGIN { suma=0 } { suma += $2 } END { print "Suma drugiej kolumny:", suma }' dane.txt
9. AWK jako „kalkulator” na plikach – kluczowe konstrukcje
9.1. Liczenie liczby wierszy
Aby wypisać liczbę wierszy w pliku, użyj:
awk 'END { print NR }' plik.txt
9.2. Średnia wartości w kolumnie
Przykład obliczenia średniej z drugiej kolumny:
awk '{ suma += $2; licznik++ } END { print "Średnia:", suma/licznik }' dane.txt
10. Praktyka – analiza logów serwera WWW (Apache/Nginx)
Przykładowy log dostępu (Apache combined) może wyglądać tak:
192.168.0.10 - - [01/Jun/2026:12:34:56 +0200] "GET /index.html HTTP/1.1" 200 1024 "-" "Mozilla/5.0 ..."
Najczęściej interesujące pola to:
- IP klienta,
- żądany URL,
- kod HTTP,
- liczba przesłanych bajtów (rozmiar odpowiedzi).
Załóżmy typowy format pól w access.log:
$1– IP;$4– data/czas (w nawiasie[...]);$6– metoda HTTP (w cudzysłowie, np."GET);$7– ścieżka (URL);$9– kod HTTP;$10– rozmiar odpowiedzi.
10.1. Lista wszystkich adresów IP
Aby wypisać IP z każdej linii logu, użyj:
awk '{ print $1 }' access.log
10.2. Top 10 IP z największą liczbą żądań
Do policzenia i posortowania IP według liczby żądań, wpisz:
awk '{ ip[$1]++ } END { for (i in ip) print ip[i], i }' access.log | sort -nr | head -n 10
Co się dzieje w powyższym potoku:
ip[$1]++– asocjacyjna tablica indeksowana IP, zlicza wystąpienia,- w
ENDwypisujemy: liczba_żądań oraz IP, sort -nr– sortowanie malejąco po liczbie,head -n 10– pokazuje pierwsze 10 rekordów.
10.3. Liczenie kodów HTTP (200, 404, 500…)
Policz, ile razy wystąpił każdy kod odpowiedzi:
awk '{ kod[$9]++ } END { for (k in kod) print k, kod[k] }' access.log | sort
10.4. Sumaryczny transfer (bajty) z logów
Aby podsumować łączny transfer w bajtach, użyj:
awk '$10 ~ /^[0-9]+$/ { suma += $10 } END { print "Łączny transfer (bajty):", suma }' access.log
Wzorzec $10 ~ /^[0-9]+$/ chroni przed wpisami „-” lub pustymi.
10.5. Lista najczęściej oglądanych URL-i
Do policzenia popularności adresów URL wpisz:
awk '{ url[$7]++ } END { for (u in url) print url[u], u }' access.log | sort -nr | head -n 20
11. Praca z plikami CSV (statystyki internetowe, kampanie)
Przykładowy plik stats.csv może wyglądać tak:
data,odsłony,kliknięcia,koszt
2026-06-01,1000,50,10.50
2026-06-02,1200,60,11.00
2026-06-03,800,40,8.75
11.1. Ustawienie separatora na przecinek
Podstawowe wyciąganie kolumn z CSV rozdzielanego przecinkiem:
awk -F, '{ print $1, $2 }' stats.csv
11.2. Pominięcie nagłówka (pierwszy wiersz)
Aby pominąć nagłówek i wypisać pierwsze dwie kolumny, użyj:
awk -F, 'NR > 1 { print $1, $2 }' stats.csv
11.3. Sumowanie odsłon i kliknięć
Podsumowanie metryk w całym pliku:
awk -F, 'NR > 1 { sum_ods += $2; sum_klik += $3 } END { print "Suma odsłon:", sum_ods; print "Suma kliknięć:", sum_klik }' stats.csv
11.4. Wyliczenie CTR i średniego CPC
Wzory: CTR = kliknięcia / odsłony, CPC = koszt / kliknięcia. Przykład obliczeń:
awk -F, 'NR > 1 { sum_ods += $2; sum_klik += $3; sum_koszt += $4; } END { ctr = (sum_klik / sum_ods) * 100; cpc = sum_koszt / sum_klik; print "CTR (%):", ctr; print "Średni CPC:", cpc; }' stats.csv
12. Przetwarzanie wyników poleceń systemowych
AWK świetnie współpracuje z innymi narzędziami przez potok, co ułatwia szybkie analizy.
12.1. ps – filtrowanie procesów (np. serwer WWW)
Przykład filtrowania procesów związanych z Nginx:
ps aux | awk '/nginx/ && !/awk/ { print $1, $2, $3, $11 }'
Co oznaczają poszczególne fragmenty:
/nginx/– tylko linie zawierające „nginx”,!/awk/– wyklucza wiersz z samymawk,$1, $2, $3, $11– wypisz: użytkownik, PID, CPU, komenda.
12.2. ss/netstat – otwarte połączenia HTTP
Lista ustanowionych połączeń TCP na porcie 80 w ss:
ss -tn state established '( sport = :80 )' | awk 'NR > 1 { print $5 }'
Aby zliczyć połączenia per IP (bez portu), użyj:
ss -tn state established '( sport = :80 )' | awk 'NR > 1 { split($5, a, ":"); ip = a[1]; polaczenia[ip]++; } END { for (i in polaczenia) print polaczenia[i], i; }' | sort -nr | head
13. Zaawansowane wzorce i wyrażenia regularne
AWK obsługuje pełne wyrażenia regularne, co pozwala na precyzyjne dopasowania.
13.1. Dopasowanie domeny w logach
Filtrowanie po domenie w pełnych adresach URL:
awk '$7 ~ /example\.com/ { print $1, $7 }' access.log
13.2. Filtrowanie kodów 4xx i 5xx
Wypisz błędne odpowiedzi (klasy 4xx i 5xx):
awk '$9 ~ /^4[0-9][0-9]$/ || $9 ~ /^5[0-9][0-9]$/ { print $1, $9, $7 }' access.log
14. Funkcje wbudowane w AWK – praktyczne dla danych internetowych
Przydatne funkcje tekstowe: length, substr, index, tolower, toupper, gsub, sub. Funkcje matematyczne: int, sqrt, sin, cos, rand…
14.1. Wyciąganie domeny z adresu e‑mail
Załóżmy plik users.txt z identyfikatorami i adresami e‑mail:
1 [email protected]
2 [email protected]
3 [email protected]
Aby wyświetlić domenę e‑mail, użyj:
awk '{ split($2, a, "@"); print a[2]; }' users.txt
split(tekst, tablica, separator) rozdziela tekst na tablicę według podanego separatora.
14.2. Liczenie użytkowników per domena
Zlicz użytkowników dla każdej domeny:
awk '{ split($2, a, "@"); domena = a[2]; count[domena]++; } END { for (d in count) print d, count[d]; }' users.txt | sort
15. Skrypty AWK w plikach (-f) – organizacja większych „programów”
Gdy program AWK robi się dłuższy, lepiej przenieść go do osobnego pliku. Przykładowy plik statystyki.awk:
BEGIN { FS=","; OFS=","; print "data", "odsłony", "kliknięcia", "CTR"; }
NR > 1 { ctr = ($3 / $2) * 100; print $1, $2, $3, ctr; }
Uruchom skrypt z pliku poleceniem:
awk -f statystyki.awk stats.csv
-f plik.awk wczytuje program AWK z pliku zamiast z parametru w pojedynczych cudzysłowach.
To wygodne przy:
- cyklicznych raportach z logów,
- skryptach cron przetwarzających dane serwera www,
- integracjach z systemami monitoringu.
16. Porównanie AWK z innymi narzędziami (grep, sed)
W ekosystemie Linuksa AWK jest jednym z kilku głównych narzędzi do tekstu. Porównanie z grep i sed wygląda następująco:
| Narzędzie | Główne przeznaczenie | Typowe użycie |
|---|---|---|
| grep | proste wyszukiwanie wzorców | znajdź linie z „ERROR” w logu |
| sed | edycja strumieniowa (zamiany, proste przekształcenia) | zamień domenę, usuń linie, podmień tekst |
| awk | przetwarzanie rekordów i pól, raportowanie, mini‑skrypty | analizy logów, raporty CSV, sumowania, statystyki |
AWK jest idealny do wyodrębniania kolumn, filtrowania wierszy, obliczania statystyk i generowania raportów, szczególnie z logów i plików CSV.
17. Typowe pułapki i dobre praktyki
17.1. Używaj cudzysłowów pojedynczych wokół programu
W powłoce Bash unikaj interpretacji zmiennych przez powłokę:
Dobrze: awk '{ print $1 }' plik
Źle: awk "{ print $1 }" plik — powłoka spróbuje zinterpretować $1.
17.2. Uważaj na separator pól w logach
W logach HTTP część pól jest w cudzysłowach i zawiera spacje (np. User‑Agent). Dokładnie sprawdź, które pole odpowiada za dany element; w razie potrzeby użyj niestandardowego FS (np. wyrażenia regularnego).
Przykład prostego separatora pól jako regexu (co najmniej jedna spacja):
awk 'BEGIN { FS = "[ ]+" } { print $1, $7 }' access.log
17.3. Konwersja danych z myślą o dalszej obróbce
Jeśli wynik AWK ma być wczytywany do Excela, Pandas itp., ustaw OFS na przecinek lub średnik i dodaj nagłówek, np. BEGIN { print "kol1,kol2,..." }.
18. Mini „ściąga” – najważniejsze konstrukcje AWK
Poniższe przykłady możesz od razu uruchomić w terminalu:
# 1. Wyświetlenie 1. kolumny
awk '{ print $1 }' plik.txt
# 2. Zmiana separatora pól na przecinek
awk -F, '{ print $1, $3 }' plik.csv
# 3. Filtrowanie wierszy: druga kolumna > 100
awk '$2 > 100 { print $0 }' dane.txt
# 4. Filtrowanie po tekście (regex)
awk '/ERROR/ { print $0 }' log.txt
# 5. Liczenie liczby wierszy
awk 'END { print NR }' plik.txt
# 6. Suma wartości w 2. kolumnie
awk '{ suma += $2 } END { print suma }' dane.txt
# 7. Średnia z 3. kolumny
awk '{ s += $3; n++ } END { print s/n }' dane.txt
# 8. Top 10 IP z access.log
awk '{ ip[$1]++ } END { for (i in ip) print ip[i], i }' access.log \
| sort -nr | head -n 10
# 9. Liczba odpowiedzi 404 w logu
awk '$9 == 404 { ile++ } END { print ile }' access.log
# 10. Uruchomienie programu z pliku
awk -f program.awk dane.txt
19. Jak zacząć uczyć się AWK (prosta instrukcja dla czytelnika)
- Otwórz terminal na swoim systemie Linux (lub WSL / maszynie wirtualnej).
- Stwórz prosty plik testowy z danymi, wpisując:
cat > dane.txt <<EOF
Jan 10
Anna 20
Piotr 15
EOF
- Przetestuj podstawowe operacje na polach i sumowaniu:
awk '{ print $1 }' dane.txt
awk '{ print $2 }' dane.txt
awk '$2 > 15 { print $1, $2 }' dane.txt
awk '{ suma += $2 } END { print "Suma:", suma }' dane.txt
- Następnie przejdź do prawdziwych danych:
access.logz serwera WWW,- pliki CSV z Google Analytics / Matomo / innego narzędzia,
- wyniki
ps aux,netstat,ss,df,ip a.
- Stopniowo dodawaj kolejne elementy składni:
BEGINiEND,- własne zmienne i tablice,
- wyrażenia regularne.








