Małe narzędzia robią wielkie rzeczy. A awk to cała orkiestra.

– Mądrość od kolesia, który raz przetwarzał 100GB logów

Podstawy awk: Tekst jako baza danych!

awk (nazwa pochodzi od nazwisk twórców: Alfred Aho, Peter Weinberger, Brian Kernighan) traktuje pliki tekstowe jak tabelę. Każda linia to rekord, a każde słowo (domyślnie oddzielone spacją) to pole. I na tym buduje całą swoją potęgę.

Podstawowa składnia: pattern { action }

To jest esencja awk: dla każdej linii (pattern) wykonaj (action).

# Dla każdej linii wykonaj akcję

awk 'warunek { akcja }' plik

# Użyj dwukropka jako separatora pól (`-F`) i wydrukuj pierwsze pole

awk -F':' '{ print $1 }' plik

Zmienne specjalne: Poznaj słowniczek awk

awk ma kilka wbudowanych zmiennych, które ułatwiają życie:

  • $0 – cała linia (rekord)
  • $1, $2, ... – kolejne pola (kolumny)
  • NF – Number of Fields, czyli liczba pól w bieżącej linii
  • NR – Number of Record, czyli numer bieżącej linii
  • FS – Field Separator, czyli separator pól wejściowych (domyślnie spacja)
  • RS – Record Separator, czyli separator rekordów (domyślnie znak nowej linii)
  • OFS – Output Field Separator, czyli separator pól wyjściowych (domyślnie spacja)

Podstawowe operacje: Zostań maestro danych!

Wyświetlanie: Co z tego tortu chcesz?

# Wyświetl tylko pierwszą kolumnę

awk '{print $1}' plik.txt

# Wyświetl pierwszą i trzecią kolumnę

awk '{print $1, $3}' plik.txt

# Wyświetl coś więcej, niż tylko surowe dane. Drukuj tekst + kolumnę

awk '{print "Kolumna 1:", $1}' plik.txt

Separator: Elastyczność przede wszystkim!

awk jest elastyczny, jeśli chodzi o to, czym oddzielone są Twoje dane.

# Użyj dwukropka (`:`) jako separatora pól i wydrukuj pierwszą kolumnę z /etc/passwd

awk -F':' '{print $1}' /etc/passwd

# Separator może być też regexem. Tutaj: spacja lub tab

awk -F'[ \t]' '{print $1}' plik.txt

# Zdefiniuj separator wyjściowy (`OFS`). Tutaj: wydrukuj $1 i $5 oddzielone " | "

awk -F':' 'BEGIN {OFS=" | "} {print $1, $5}' /etc/passwd

Warunki: Tylko te, które spełniają kryteria!

awk może wykonywać akcje tylko dla linii, które spełniają określone warunki.

# Wydrukuj linie zawierające "error" (to samo co `grep error plik.log`)

awk '/error/ {print}' plik.log

# Wydrukuj linie, gdzie trzecie pole jest większe niż 100

awk '$3 > 100 {print}' plik.txt

# Warunek złożony: wydrukuj linie z "error" ORAZ piąte pole > 10

awk '/error/ && $5 > 10 {print}' plik.log

Praktyczne przykłady: Od danych do wiedzy (i bezpieczeństwa)!

Analiza logów: Kto, co, kiedy i dlaczego się zepsuło?

# Wyciągnij adres IP ($1) i kod HTTP ($9) z logów access.log

awk '{print $1, $9}' access.log

# Znajdź wszystkie błędy HTTP 500 w access.log

awk '$9 == 500 {print}' access.log

# Zsumuj rozmiar wszystkich transferowanych plików ($10) w access.log

awk '{sum+=$10} END {print sum}' access.log

Przetwarzanie danych: Statystyki na zawołanie!

# Oblicz średnią z pierwszej kolumny w pliku dane.txt

awk '{sum+=$1; n++} END {print sum/n}' dane.txt

# Znajdź maksymalną wartość w pierwszej kolumnie

awk 'BEGIN {max=0} {if($1>max) max=$1} END {print max}' dane.txt

# Grupuj dane i sumuj drugie pole dla każdego unikalnego pierwszego pola

awk '{sum[$1]+=$2} END {for(k in sum) print k, sum[k]}' dane.txt

Bezpieczeństwo: Polowanie na zagrożenia!

awk jest nieoceniony w analizie bezpieczeństwa – od wyciągania hashy po analizę logów autoryzacji.

# Wyciągnij nazwy użytkowników ($1) z /etc/shadow, których hashe zaczynają się od '$' (czyli nie są puste)

awk -F':' '$2 ~ /^\$/ {print $1}' /etc/shadow

# Analizuj auth.log: wydrukuj datę, czas i pole numer 11 (często IP atakującego) dla linii z "Failed"

awk '/Failed/ {print $1,$2,$3,$11}' /var/log/auth.log

# Zlicz unikalne adresy IP z access.log i posortuj od najczęściej występujących

awk '{print $1}' access.log | sort | uniq -c | sort -rn | awk '{print $2, $1}'

Zaawansowane sztuczki: Gdy stajesz się ekspertem!

# Tablice asocjacyjne: zlicz wystąpienia każdego IP w access.log

awk '{ip[$1]++} END {for (i in ip) print i) print i, ip[i]}' access.log

# Funkcje wbudowane: length (długość), substr (podciąg)

awk 'BEGIN {print length("test")}'
awk 'BEGIN {print substr("hello", 2, 3)}' # Wypisze "ell"


# Konstrukcje warunkowe (IF/ELSE)

awk '{if ($1 > 100) print "duzy"; else if ($1 > 50) print "sredni"; else print "maly"}' dane.txt

Podsumowanie: Król przetwarzania tekstu!

awk to prawdziwy kombajn. To nie tylko narzędzie, to filozofia myślenia o tekście. Raz opanowany, zostanie z Tobą na zawsze i uratuje Cię z niejednej opresji, gdy inni będą bezradnie patrzeć na gigabajty logów.

Kluczowe punkty do zapamiętania:

  • awk traktuje plik jak bazę danych: linie to rekordy, słowa to pola.
  • Składnia pattern { action } to serce awk.
  • Zmienne specjalne ($0, $1, NF, NR, FS, OFS) dają Ci kontrolę.
  • Możesz używać wyrażeń regularnych i warunków.
  • Potrafi grupować, liczyć, sumować – wszystko, co potrzebujesz do szybkiej analizy danych.
# Twój nowy zestaw do super-analizy logów (wyciągnij IP i kod, zlicz wystąpienia, posortuj):

awk '{print $1, $9}' access.log | sort | uniq -c | sort -rn

Kolejny odcinek: sed – nadchodzi edytor strumieniowy! Nauczymy się zmieniać tekst na żywo, bez otwierania plików. Zostań z nami!