AWK w Linuksie – najważniejsze polecenia i przykłady

Oskar Gajzler
Przez
Oskar Gajzler
Redaktor IINTE.edu.pl, na co dzień zajmuje się technologiami internetowymi i tłumaczeniem skomplikowanych tematów na prosty język. Pisze poradniki o tym, jak załatwiać sprawy przez internet, jak...
17 min czytania

1. Co to jest AWK i kiedy się przydaje?

AWK to:

  • 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, ip itd.).

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 END wypisujemy: 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 samym awk,
  • $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)

  1. Otwórz terminal na swoim systemie Linux (lub WSL / maszynie wirtualnej).
  2. Stwórz prosty plik testowy z danymi, wpisując:

cat > dane.txt <<EOF
Jan 10
Anna 20
Piotr 15
EOF

  1. 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

  1. Następnie przejdź do prawdziwych danych:
  • access.log z serwera WWW,
  • pliki CSV z Google Analytics / Matomo / innego narzędzia,
  • wyniki ps aux, netstat, ss, df, ip a.
  1. Stopniowo dodawaj kolejne elementy składni:
  • BEGIN i END,
  • własne zmienne i tablice,
  • wyrażenia regularne.
Udostępnij ten artykuł
Obserwuj
Redaktor IINTE.edu.pl, na co dzień zajmuje się technologiami internetowymi i tłumaczeniem skomplikowanych tematów na prosty język. Pisze poradniki o tym, jak załatwiać sprawy przez internet, jak bezpiecznie korzystać z sieci i jak dobierać sprzęt oraz oprogramowanie. Prywatnie tropi nowinki technologiczne i testuje je, zanim opisze.
Brak komentarzy

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *