AWK
E' un mini-linguaggio, inventato da Aho, Weinberger e Kernighan (da cui il nome).
- Scandisce un file, cerca linee con match ad un'espressione regolare ed esegue su di esse uno o più comandi.
- Opzionalmente esegue comandi prima dell'inizio e dopo la fine della scansione del file.
- Possiede numerose variabili predefinite e numerose funzioni
Nella sua semplicità è una piccola meraviglia. Assomiglia come sintassi al Linguaggio C, ma è molto meno formale, ed è un linguaggio di scripting, non compilato.
Sintassi:
awk [opzioni}ì] 'BEGIN{comandi}/pattern/{comandi}END{comandi}' file
awk '{comandi}' file
awk '/pattern/{comandi}' file
awk 'END{comand}' file
comando | awk '...'
awk -f procedura file
Esempio.
Sommare lo spazio occupato dai file di una directory, che non siano sottodirectories.
ls -l | awk 'BEGIN{tot=0}/^[-]/{tot+=$5}END{print tot}'
Dove $5
è il quinto campo di un rapporto ls -l
. In awk il separatore di campo è un qualsiasi numero di caratteri 'spazio', 'tab' e 'newline'. Se dovessimo farlo con cut
dovremmo contare le colonne.
La variabile predefinita $1
sta per il primo campo sulla linea corrente, $2
il secondo, e così via. $0
è l'intera linea corrente. Quindi:
awk '{print $0}` file
è lo stesso di cat file
.
Awk è corredato di un insieme cospicuo di funzioni matematiche. Stampare il seno di un angolo di un radiante:
awk '{print sin (1)}' < /dev/null
Qui il trucco è la ridirezione da /dev/null
, poichè awk si aspetta un file in input.
I programmi awk si possono inserire in files di procedura, se lunghi, e richiamare all'esecuzione. Per esempio il file vi owner.awk
(notare che se il file ha l'estensione awk
, il vim
lo riconosce e da la colorazione sintattica giusta):
#!/bin/awk -f
BEGIN { print "File\tOwner" }
{ print $9, "\t", \
$3}
END { print " - DONE -" }
Lo si esegue con:
ls -l | awk -f owner.awk