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 }' plikZmienne 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 liniiNR– Number of Record, czyli numer bieżącej liniiFS– 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.txtSeparator: 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/passwdWarunki: 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.logPraktyczne 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.logPrzetwarzanie 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.txtBezpieczeń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.txtPodsumowanie: 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 -rnKolejny odcinek: sed – nadchodzi edytor strumieniowy! Nauczymy się zmieniać tekst na żywo, bez otwierania plików. Zostań z nami!