Awk
# 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:

L'accesso agli array avviene solitamente tramite la keyword in, che cicla sulle chiavi dell'array specificato, con ordine indefinito:

Nel caso di un array sequenziale è possibile usare la sintassi C-style:

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:

## Struttura di un programma

Un programma in AWK è strutturato secondo una sequenza di direttive del tipo:

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:

viene fornito l'input:

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:

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.

