C:\> RetroPC

appunti e note di un estimatore della riga di comando

Un linguaggio utile, libero e per qualsiasi sistema operativo: awk

Anche la versione più desueta di DOS può permetterci di filtrare testi o creare piccoli e utili database testuali, grazie all'eleganza concettuale di un linguagio esistente da moltissimi anni, ma ingiustamente misconosciuto.
Il curioso nome AWK deriva dalle iniziali dei suoi tre inventori: Aho, Weinberger e Kernighan (si', proprio quello del C).
L'implementazione GNU del linguagio si chiama GAWK, ed è disponibile per qualsiasi sistema UNIX, dove si rivela adattissimo all'elaborazione, ad esempio, dei files di log e per il lavoro di reportistica e controllo degli amministratori di sistema.
Ciò che me lo rende ancora più simpatico, è che AWK è disponibile per qualsiasi sistema operativo, anche per dos. Vediamo allora, a grandi linee e per esempi, come funziona.

Dovendo esprimere in sintesi la caratteristica principale di awk, direi che il linguaggio si basa sul concetto di pattern - azione.
Il testo in input viene scandito interamente alla ricerca del pattern specificato. Al verificarsi della condizione e' associata un'azione (o un blocco di azioni).

Il commento, in AWK, e' preceduto dal cancelletto #.
Uno script awk puo' essere iniziato da BEGIN seguito da un blocco di istruzioni (sono in genere inizializzazioni di variabili), e chiuso da END, che contiene un altro blocco di istruzioni da eseguire al termine dello script.
Per blocco si intende un gruppo di istruzioni contenute entro parentesi graffe. A differenza del C, non e' necessario il punto e virgola al termine di ogni istruzione.

Un esempio rende l'idea meglio di tante parole. Supponiamo di voler dare in pasto ad AWK un file testuale, affinche' conteggi quante volte ricorra nel testo la parola "pippo".
Chiamo lo script ex1.awk, editandolo con l'editor di testo che preferisco:

BEGIN { cont=0 }
/pippo/ {cont++}
END {
print "La parola pippo ricorre",cont, "volte" }
lo script viene eseguito da riga di comando come:

awk foo <nome del file in cui effettuare la ricerca>
Vediamo un secondo esempio. Voglio stampare a video le righe di un file di testo (nel mio esempio: foo.txt) comprese tra la quinta e la decima. Ecco il codice, che si avvale della variabile speciale NR. L'uso dello script e' presentato nei commenti:

# I valori inferiore e superiore (a e b) vanno indicati da linea di comando
# Es: awk rangeprn foo.txt a=5 b=10
# In output verranno stampate sullo STDOUT le righe del file foo comprese tra
# la quinta e la decima

{line[NR] = $0 }           # carica tutto il file in un array
END {while (a <= b) {      # finche' a e' minore o uguale a b
     print line[a]         # stampa la linea con indice [a]
     a++                   # incrementa a
                     }
     }


Per provare a utilizzare awk sotto dos, basta scaricare la versione compilata per DOS , dezipparla e mettersi al lavoro. Buon divertimento!

2004-2019 Paolo Gironi - P.Iva 03137610246