AWK Salvatore Campagna Email: salvatore.campagna@polito.it Politecnico di Torino Dipartimento di Automatica e Informatica
Introduzione Linguaggio di scripting parser scritto nel 1977 da: A. V. Aho P. J. Weinberger B. W. Kernighan Sintassi simile al C Attenzione i vettori con indici numerici hanno indice che comincia da 1 ..
Documentazione Fare riferimento a MAN AWK (come sempre) Risorsa web: http://people.cs.uu.nl/piet/docs/nawk/nawk_toc.html
Funzionamento E’ un filtro Si specifica un pattern per una riga e si esegue una azione se la riga rispetta il pattern Ogni file in input è diviso in record (line) Ogni record è diviso in campi (parole)
Riga di comando Si specificando pattern e azioni direttamente sulla shell awk [opzioni] ‘patter/azioni’ <file> Si può passare in input anche un file che contiene pattern e azioni Awk [opzioni] –f <script> <file> Opzioni utili -v var=hello: definisce una variabile con il suo valore e lo passa all’engine AWK
Comandi AWK Sono coppie patter/azione pattern { azione; } Se manca l’azione di default awk visualizza in output la riga Se manca il pattern l’azione viese eseguita su ogni riga
Pattern Un pattern può essere: Esempi: Una espressione regolare: /regexp/ Una espressione di confronto; Esempi: /^#/ $1 == ‘’prova’’ || $1 == ‘’PROVA’’ $1 ~ /^#/
Operatori di confronto ==, != >, <, >=, <= ~: match con espressione ! ~: no match con espressione Operatori logici && (and), || (or), ! (not)
Pattern predefiniti Esiston due pattern predefiniti: Esempi: START: l’azione associata viene eseguita prima di cominciare a processare la prima riga del file di input END: l’azione associata viene eseguita dopo aver processato tutte le righe del file di input Esempi: BEGIN { FS=‘’:’’ } END { printf (‘’Risultato: %d\n’’, result); }
Variabili Non hanno tipo (il loro tipo dipende dal contesto) Si usano come in C e non serve il simbolo $ Il $ serve a fare riferimento al campo i- esimo del record che è in fase di processamento I vettori sono associativi: indici sia numerici che letterali
Variabili predefinite $0: tutto il record (linea) corrente $1, $2, ... $i ...: campo i-esimo del record corrente NF: numero di campi del record corrente $NF: il valore dell’ultimo campo FS: separatore di campi (default spazio) RS: separatore di record (line) (default ‘a capo’)
Array Sono delle mappe o hash table Sono array associativi: indici sia numerici che letterali Multidimensionali: chiave di accesso combinazione degli indici Esempi: giorni[gennaio]=31 $1 ~ /^[0-9]/ { quant[$2,data]+=$1; } val[$1]=$2
Operare su array Costrutto if: Costrutto for: Costrutto delete: if ( val in array ) { ... } Costrutto for: for ( val in array ) { ... } Costrutto delete: delete array delete array[index] Se si accede a un elemento inesistente viene restituito 0 o la stringa vuota a seconda del contesto
Operare con le stringhe (string1 string2 string3 ...): concatenazione gsub(r, s[, t]); sostituisce le occorrenze di r con s in t (se t non c’è allora opera su $0) usare l’& per ottenere il valore del match Restituisce il numero di sostituzioni effettuate length(s) Restituisce la lunghezza della stringa match (s, r): restituisce la prima occorrenza di r in s
Operare con le stringhe split (s, a [, d]) Suddivide s in parole rispetto al delimitatore d e mette il risultato nel vettore a Restituisce il numero di elementi in a Substr(s, i [, n]): Ritorna n caratteri di s a partire dall’i-esimo. Se n non c’è dall’i-esimo alla fine toupper(s), tolower(s) Ritornano la stringa s in maiuscolo o minuscolo
Gestione dell’IO getline [var] [<file] print str [> file ] Legge il record seguente da file (o da file corrente) in var (o $0) print str [> file ] printf (format, ...) [> file ] Stampa su stdout o file. print non vuole le () e aggiunge newline system(command): chiama la shell per eseguire command exit: termina eseguendo il pattern END (se c’è)
Getline L’utilizzo tipico di getline è quello di leggere un secondo file (in più rispetto a quello che si sta leggendo) BEGIN { while getline < vocabolario.txt diz[$1]=$2 } { for(i=0; i<NF; i++){ if($i in diz) {printf(“%s”, diz[$i]);} else {printf(“%s”, $i);}
Funzioni definite dall’utente Si possono definire funzioni Sintassi: function my_func (param1, param3, ,,,) { /*azioni*/ return val; } Uso della funzione: pattern { return_value=my_func(param1, param2, ...);