GNU/Linux: introduzione al comando awk

Oggi parliamo di awk, un vero e proprio linguaggio di programmazione pensato per elaborare file di testo. Lo trovi su qualunque sistema Linux ed è uno strumento formidabile per estrarre, filtrare e riformattare dati. Qui vediamo le basi, con esempi semplici che poi puoi applicare a file molto più grossi.

Per gli esempi uso lista.txt, con nome, cognome ed età separati da tabulazioni:

printf 'Mario\tRossi\t30\nLuisa\tBianchi\t25\nAnna\tVerdi\t41\n' \
    > lista.txt

Come ragiona awk

awk legge l’input una riga alla volta. Il programma è fatto di pattern e azioni. Il flusso è questo:

  • un blocco BEGIN, eseguito una sola volta prima di leggere;
  • il blocco principale, eseguito per ogni riga letta;
  • un blocco END, eseguito una sola volta alla fine.

Dentro le azioni, $0 è la riga intera, $1 il primo campo, $2 il secondo e così via. I campi sono separati da spazi o tabulazioni.

Un primo programma

Mettiamo insieme i tre blocchi: stampo un’intestazione, poi ogni riga così com’è, e infine una riga di chiusura:

awk 'BEGIN{printf "nome\tcognome\tanni\n"} {print} \
    END{printf "-----\n"}' lista.txt

L’output:

nome    cognome anni
Mario   Rossi   30
Luisa   Bianchi 25
Anna    Verdi   41
-----

Il programma in un file

Quando il programma cresce conviene metterlo in un file e richiamarlo con -f. Creiamo esempio.awk con lo stesso contenuto:

BEGIN { printf "nome\tcognome\tanni\n" }
{ print }
END { printf "-----\n" }

e lo lanciamo così:

awk -f esempio.awk lista.txt

Passare variabili

Con l’opzione -v si passa un valore dalla riga di comando al programma. Creiamo variabili.awk:

BEGIN { printf "ciao %s\n", nome }

e lo lanciamo valorizzando la variabile nome:

awk -v nome=Mario -f variabili.awk

Il risultato è la riga:

ciao Mario

Scegliere I campi

Per stampare solo nome e cognome, separati da una tabulazione:

awk '{print $1 "\t" $2}' lista.txt

Filtrare con un pattern

Un’espressione regolare fra barre funge da pattern: l’azione scatta solo sulle righe che la soddisfano. Se non metto l’azione, awk stampa la riga. Le righe che contengono una n:

awk '/n/' lista.txt

Contare

Le variabili in awk nascono da sole, a zero. Basta incrementarne una per ogni riga che corrisponde e stamparla nel blocco END:

awk '/n/{tot++} END{print tot}' lista.txt

Qui conta quante righe contengono una n.

Condizioni sui campi

Il pattern può anche essere una condizione. La funzione length restituisce la lunghezza di una stringa: stampo le righe in cui il cognome supera i cinque caratteri.

awk 'length($2)>5' lista.txt

In sintesi

  • awk lavora per righe e per campi ($1, $2, …);
  • BEGIN e END girano una volta sola, all’inizio e alla fine;
  • -f carica il programma da un file, -v passa variabili;
  • un pattern decide su quali righe agire;
  • le variabili si usano senza dichiararle, ottime per i contatori.

Awk ha molto altro, ma già così sostituisce parecchi giri di grep, cut e sort. Provalo sui tuoi file.

Link e risorse

Sostieni il canale

PER SOSTENERE IL CANALE BASTANO UN LIKE E UN’ISCRIZIONE!

questi link sono affiliati Amazon, acquistando i libri che ti consiglio sostieni il canale!