awk în Linux / Bash

Procesare și filtrare text POSIX / GNU Awk (gawk)

Limbaj de procesare a textului structurat pe coloane, ideal pentru rapoarte și extragere de date.

Sintaxă comandă
awk [opțiuni] 'tipar { acțiune }' [fișier...]

Ce face awk

Comanda awk este un limbaj complet de programare conceput special pentru prelucrarea datelor organizate pe rânduri și coloane (cum ar fi jurnalele web, fișierele CSV sau tabelele din terminal).

Împarte automat fiecare rând în câmpuri numerotate: $1 este prima coloană, $2 a doua, iar $0 reprezintă întreaga linie. Variabila NR indică numărul liniei curente, iar NF numărul total de coloane de pe rândul curent.

Opțiuni și argumente

Opțiune / Parametru Descriere
-F SEPARATOR Definește caracterul separator de coloane (implicit spații albe sau tab-uri; de ex. -F, sau -F:).
$1, $2, ... Referă coloana corespunzătoare din linia curentă.
$0 Reprezintă întreaga linie curentă.
NR Numărul curent al rândului procesat (Number of Record).
NF Numărul de coloane/câmpuri de pe rândul curent (Number of Fields).

Exemple

Exemplul 1: Extragerea anumitor coloane dintr-un tabel

Afișăm doar numele produsului și prețul din fiecare rând.

cat << 'EOF' > produse.txt
paine 5 lei
lapte 8 lei
branza 20 lei
EOF
awk '{print $1, "costa", $2, $3}' produse.txt

Rezultat

paine costa 5 lei
lapte costa 8 lei
branza costa 20 lei

Exemplul 2: Calcularea sumei unei coloane numerice

Blocul END se execută o singură dată la finalul procesării.

cat << 'EOF' > note.txt
Mate 9
Info 10
Fizica 8
EOF
awk '{suma += $2} END {print "Total puncte:", suma}' note.txt

Rezultat

Total puncte: 27

Greșeli frecvente

  • Confuzia între variabilele de shell ($VAR) și variabilele awk ($1) când comanda awk este scrisă în ghilimele duble în loc de ghilimele simple.

Comenzi înrudite

  • cut: Decupează secțiuni, coloane sau intervale de caractere din fiecare linie de text.
  • sed: Editor de flux (stream editor) pentru transformarea, înlocuirea și filtrarea automată a textului.
  • sort: Sortează liniile de text în ordine alfabetică, numerică sau după o coloană specifică.