Awk

AWK (dalle iniziali dei cognomi dei suoi autori, Alfred Aho, Peter Weinberger e Brian Kernighan) è un linguaggio di programmazione interpretato orientato alla manipolazione di dati di tipo testuale, sia in forma di file che di flusso di dati provenienti dallo standard input.

Tipi di variabile 
È un linguaggio debolmente tipizzato, e qualunque variabile può essere considerata alla stregua di una stringa (può essere concatenata, è possibile contarne il numero di caratteri, eccetera), anche se le variabili numeriche vengono convertite a numeri interi o a virgola mobile quando necessario, ad esempio nelle operazioni aritmetiche.
È assente il tipo booleano (ovvero variabili dal valore true o false), ma è possibile usare qualunque variabile come valore booleano: il valore 0, la stringa vuota ("") o una variabile non inizializzata sono considerati false, mentre qualunque altro valore è true.

Oltre alle variabili scalari, AWK supporta anche gli array associativi, cioè array indicizzati tramite stringhe chiave. Poiché in AWK qualunque scalare può essere considerato una stringa, è anche possibile definire array le cui chiavi sono numeri interi sequenziali, ma tipicamente, a differenza di molti altri linguaggi di programmazione, questo non porta alcun vantaggio in termini di prestazioni di accesso, perché AWK non fa distinzione tra array sequenziali e array associativi.

Ad esempio, è possibile definire i due array:
# array "sequenziale"
arr1[0] = "a"
arr1[1] = "b"
arr1[2] = "c"
# array che usa stringhe come chiavi
arr2["foo"] = 1
arr2["bar"] = 2

L'accesso agli array avviene solitamente tramite la keyword in, che cicla sulle chiavi dell'array specificato, con ordine indefinito:
for (i in arr1) {
        print i     # stampa "1", "2", ... in maniera NON sequenziale
}
for (i in arr2) {
        print i     # stampa "foo", "bar" (in maniera sempre non sequenziale)
}
Nel caso di un array sequenziale è possibile usare la sintassi C-style:
for (i = 0; i < length(arr1); ++i) {
        print arr1[i]
}
per ottenere l'accesso sequenziale ai valori.

Infine, AWK supporta le espressioni regolari. Un'espressione regolare (regular expression o regex) è definita tra due slash, ed è possibile testare il match tra un'espressione e tale regex attraverso l'operatore tilde: 
# testa se la variabile "foo" inizia con una cifra:
if (foo ~ /^[0-9]/) 
        # ...

Struttura di un programma 
Un programma in AWK è strutturato secondo una sequenza di direttive del tipo:
condizioni { azioni }
Se allo script viene fornito uno o più file, oppure in generale uno stream di dati (ad esempio attraverso lo standard input), questo stream verrà letto riga per riga da AWK; per ogni riga, le istruzioni contenute nello script vengono eseguite sequenzialmente. Per ogni istruzione, se la relativa condizione è verificata per la riga corrente, vengono eseguite le azioni corrispondenti a tale condizione.

Ad esempio, se ad un programma AWK siffatto:
# stampa a schermo solamente le righe che consistono solo di lettere minuscole.
/^[a-z]+$/ {
        print $0
}
viene fornito l'input:
123
pippo
pluto2
verrà eseguita l'azione print $0 (che stampa l'intera riga a schermo) esclusivamente per la seconda riga, mentre le altre due verranno ignorate.

Se viene specificata una condizione senza una relativa azione, l'azione di default è proprio "stampa l'intera riga", per cui nell'esempio di sopra avremmo potuto usare il codice equivalente:
/^[a-z]+$/

Se al contrario viene specificata un'azione senza una relativa condizione, quell'azione verrà eseguita per tutte le righe in input.

Condizioni speciali 
Esistono due condizioni speciali: BEGIN e END. Un'azione con condizione BEGIN viene eseguita sempre prima che un qualunque input venga processato, mentre una con condizione END viene sempre eseguita dopo che tutto l'input è stato processato.

Utilizzi 
AWK può essere usato come filtro, è stato uno dei primi strumenti a fare la sua comparsa dalla versione 7 di Unix ed ottenne la giusta fama di essere un modo per aggiungere capacità computazionali ad una pipeline Unix. L'AWK è ormai presente fra le applicazioni standard di ogni versione recente di sistema operativo Unix disponibile oggi. Implementazioni di AWK esistono comunque per quasi tutti gli altri sistemi operativi.

Solitamente AWK è un linguaggio interpretato, cioè esiste un file eseguibile chiamato awk che legge o da riga di comando o da un file il programma vero e proprio scritto in linguaggio awk e lo applica ad uno o più file di ingresso per produrre un risultato.

Esempi

Hello, world!
# esegue solamente l'istruzione BEGIN ed esce senza leggere alcun input
BEGIN { print "Hello, world!" }

Note

Altri progetti

Collegamenti esterni 
 
  The AWK Programming Language - libro consultabile on-line. È possibile scaricare l'implementazione originale dell'AWK
  GAWK (GNU Awk) - sito web
  The GNU Awk User's Guide - manuale on line di grosse dimensioni
  Gawk: Programmare efficacemente in AWK - Guida Utente di GNU Awk tradotta in italiano
 
  The AWK Manual - Manuale AWK

Linguaggi di programmazione