Awk – Una piccola introduzione

postato in: Terminale | 0

awk_big-1024x394
Buongiorno a tutti, nel post di oggi affronteremo un argomento diverso dal solito: oggi capiamo cosa è e come si utilizza il comando Awk e quali sono le sue potenzialità.

Per capire questa guida ci servirà un file su cui operare, quindi scarichiamo il nostro testo che farà da cavia a questo indirizzo.
Una volta scaricato il file di esempio stampiamolo a video per vedere come è fatto. Lo facciamo con:

cat tutorial_db.txt

 

awk-file

 

Come possiamo vedere il file in questione è composto da cinque colonne e svariate righe, la cui prima è quella di intestazione, e le restanti sono quelle che contengono i dati veri e propri.
Come è facile vedere, il file ha una formattazione particolare, che però non è rara all'interno del mondo Linux. Infatti questa è la formattazione standard che viene utilizzata dalla quasi totalità dei comandi GNU e da una gran parte di programmi Linux.
Un esempio è il comando du -h che stampa a video la lista delle partizioni montate all'interno del sistema operativo.

du

 

Uno dei possibili modi per espletare questo compito è quello di utilizzare il comando Grep. Infatti per cercare una stringa con questo programma, basta dare:

grep <stringa> <nome_del_file>

Oggi però ci vogliamo concentrare sul comando awk. Questo programma in realtà è un interprete per il linguaggio, appunto, Awk. Questo permette di svolgere la cosiddetta Data Driven Programming, ossia la programmazione guidata dai dati. Molto particolare ma molto importante.

Uno dei principali utilizzi di questo comando è quello di trovare determinate stringhe all'interno di file di testo. Vediamo alcuni esempi.

 

 

CERCARE UNA STRINGA
Analogamente al comando Grep, possiamo trovare una determinata stringa all'interno di un file di testo semplicemente indicando la stringa desiderata – che in Awk si chiama Pattern. La sintassi è:

awk /<pattern>/ <file>

Se ad esempio vogliamo selezionare tutte le stringhe che contengono la parola gold, lo possiamo fare con:

awk /gold/ tutorial_db.txt

Attenzione, Awk cercherà all'interno di ogni riga del file tutorial_db.dat la presenza della stringa gold e di tutte quelle che lo contengono.

gold
Analogamente l'input non deve necessariamente arrivare da un file, ma può anche essere generato da un comando, utilizzando il pipe – | .

df -h | awk /dev/

awk-pipe

 

SELEZIONARE LE COLONNE DA VISUALIZZARE
Una delle caratteristiche più utili di Awk è sicuramente quella di poter selezionare le colonne da stampare, in modo da visualizzare solamente le informazioni più importanti. Questo può essere fatto tramite l'attributo print del linguaggio. Vediamo subito un esempio chiarificatore:
Vogliamo ad esempio selezionare solamente le colonne della tipologia del metallo (la numero 1), l'anno (la numero 2) e il paese di provenienza (la numero 4). Per fare questo diamo:

awk '/gold/ {print $1"\t"$3"\t"$4}' tutorial_db.txt

In cui notiamo subito che il primo parametro è compreso da apici singoli, poi inseriamo il pattern /gold/ seguito da che cosa vogliamo che il programma faccia quando lo trova. Nel nostro caso vogliamo stampare – print – le colonne 1, 2 e 4 – $1 $3 $4 – separate dalla tabulazione – \t.

awk2

 

 

SCRIVERE DEI PROGRAMMI IN AWK
Come abbiamo visto dal comando precedente, quando vogliamo aggiungere delle operazioni in più, farlo in riga di comando diventa difficile e poco comprensibile. Come abbiamo detto nell'introduzione, Awk risulta essere anche un interprete – in realtà è principalmente un interprete. Apriamo un file di testo e iniziamo a scrivere. La principale cosa da tenere a mente è che Awk lavora a blocchi di codice:

/<pattern>/ {

    codice

}

Awk lavora leggendo riga per riga l'input, e essendo il codice strutturato in questo modo, i blocchi saranno attivati solamente nell'ordine stabilito dai dati: per questo è un linguaggio guidato dai dati.

Per queste ragioni il linguaggio ci offre i costrutti BEGIN e END che vengono eseguiti rispettivamente all'inizio e alla fine del programma.

Nel nostro esempio di prima, creiamo un file:

nano tutorial.awk

e inseriamo al suo interno:

/gold/ {
    print $1"\t"$3"\t"$4
 }

e lo eseguiamo con il comando:

awk -f <sorgente-awk> <file>

Ossia:

awk -f tutorial.awk tutorial_db.txt

E come possiamo vedere troviamo lo stesso risultato di prima.

awk-file

Link alle altre puntate:

 

A presto per altri post! 😉

 

FONTI

Dottore in Informatica. Appassionato di computer fin dal primo PC Olivetti con Windows 95 e la bellezza di 8 MB di RAM.
Utilizzatore Linux da 5 anni, credo profondamente nella filosofia open source.
Dopo tante distro provate sul mio fidato Toshiba, uso Fedora per lo studio e il divertimento.

Lascia un commento