awk

Język i narzędzie do przetwarzania tekstu w kolumnach/polach i raportowania.

awk to nie jest zwykłe polecenie, tylko mały język programowania do przetwarzania tekstu wiersz po wierszu. Sprawdza się wszędzie tam, gdzie dane są ułożone w kolumny (logi, pliki CSV, wynik ps czy df) i chcesz wyciągnąć konkretne pole, coś policzyć albo wygenerować raport. Działa według prostej zasady: dla każdego wiersza, który pasuje do wzorca, wykonuje akcję w nawiasach klamrowych. Domyślnie awk tnie każdą linię na pola po białych znakach, a dostęp do nich masz przez $1, $2 itd., gdzie $0 to cała linia.

Składnia i najważniejsze opcje

Podstawowa forma to awk 'wzorzec {akcja}' plik. Wzorzec albo akcję można pominąć — sam wzorzec drukuje pasujące linie, sama akcja wykonuje się dla każdej linii.

  • -F — ustawia separator pól wejściowych, np. -F: albo -F','.
  • -v zmienna=wartosc — przekazuje zmienną do programu przed startem (np. -v prog=12).
  • -f plik.awk — czyta program z pliku zamiast z linii poleceń (przydatne dla dłuższych skryptów).
  • NR — numer bieżącego wiersza (licznik wszystkich wczytanych linii).
  • NF — liczba pól w bieżącym wierszu; $NF to ostatnie pole.
  • FS / OFS — separator pól wejścia / wyjścia (alternatywa dla -F).
  • BEGIN { } / END { } — bloki wykonywane raz, przed pierwszą i po ostatniej linii.
  • print / printf — wypisanie pól; printf daje kontrolę nad formatem.

Przykłady użycia

  • awk '{print $1}' dostep.log — wypisuje pierwszą kolumnę z każdej linii (np. adresy IP z logu).
  • awk -F: '{print $1, $7}' /etc/passwd — pokazuje nazwę użytkownika i jego powłokę, rozdzielając pola dwukropkiem.
  • awk '$3 > 100' dane.txt — drukuje tylko te wiersze, w których trzecia kolumna jest większa niż 100.
  • awk '{suma += $5} END {print suma}' raport.csv — sumuje wartości z piątej kolumny i wypisuje wynik na końcu.
  • awk 'NR >= 10 && NR <= 20' plik.txt — wyświetla wiersze od 10 do 20 (mini-zamiennik sed -n).

Częste błędy i pułapki

Pierwsza pułapka to cudzysłowy: program awk trzymaj w pojedynczych apostrofach '...', bo w podwójnych powłoka rozwinie $1 i zostaniesz z pustką. Druga: w awk zmienne nie mają znaku dolara — $1 to pole, ale własna zmienna to po prostu suma, nie $suma. Pamiętaj też, że domyślny separator to dowolna sekwencja białych znaków, więc tabulatory i wielokrotne spacje są traktowane jak jeden — przy plikach CSV z pustymi polami ustaw -F',' jawnie. Co do wersji: na Linuksie zwykle masz GNU awk (gawk) z bogatymi rozszerzeniami, a na macOS i BSD domyślnie siedzi okrojony nawk — część funkcji (np. gensub czy strtonum) tam nie zadziała, więc skrypty pisane pod gawk potrafią się wywalić na Macu.

Powiązane komendy: sed, grep, cut, sort, tr.