Sistemi Operativi - Introduzione 1 Il sistema operativo UNIX AWK Niccolò Battezzati Politecnico di Torino Dip. Automatica e Informatica
Sistemi Operativi - Introduzione 2 Introduzione
Sistemi Operativi - Introduzione 3 Introduzione Dove si trova la documentazione: man awk
Sistemi Operativi - Introduzione 4 Funzionamento Si definiscono dei pattern e le rispettive azioni per ogni linea del file di input che fa match con un determinato pattern, viene eseguita la rispettiva azione il file di input e` diviso in record (linee) e ogni record e` diviso in campi (parole).
Sistemi Operativi - Introduzione 5 Funzionamento Si puo` usare AWK sia dando i comandi direttamente da shell: awk [options] commands input_f sia usando un file di script: awk [options] –f script_f input_f opzioni utili: -v var=val definisce una variabile var e le assegna il valore val
Sistemi Operativi - Introduzione 6 Comandi I comandi in AWK sono delle coppie pattern-azione: pattern { azione; } se un pattern non ha azione, AWK stampa ogni linea che fa match se unazione non ha pattern, viene eseguita per ciascuna linea del file.
Sistemi Operativi - Introduzione 7 Pattern I pattern possono essere: /regexp/ espressioni regolari relational_expr confronti Esempi: /^[Pp]ippo\>/ $1 == Pippo || $1 == pippo $1 ~ /[Pp]pippo\>/
Sistemi Operativi - Introduzione 8 Operatori di confronto Operatori di confronto: ==, !=, = ~ fa match con la regexp !~ NON fa match con la regexp &&, ||, ! operatori logici
Sistemi Operativi - Introduzione 9 Pattern Esistono due pattern predefiniti: BEGIN eseguito prima di scorrere il file END eseguito alla fine del file Esempi: BEGIN { FS=:;} END {printf(risultato = %d\n,res);}
Sistemi Operativi - Introduzione 10 Variabili Le variabili non hanno tipo, possono essere considerate stringhe o numeri floating-point a seconda del contesto si usano come in C, non serve il $ per farsi restituire il valore della variabile loperatore $ serve per farsi restituire il valore di un campo del record corrente o del record stesso i vettori sono associativi, sono delle hash-table.
Sistemi Operativi - Introduzione 11 Variabili predefinite Variabili predefinite: $0 il record corrente $1,$2,... i campi del record corrente NF numero di campi del record corrente $NF lultimo campo del record corrente FS il carattere separatore dei campi RS il carattere separatore dei record
Sistemi Operativi - Introduzione 12 Array Gli array sono delle mappe che usano lindice come chiave. Lindice puo` essere di qualsiasi tipo (numero o stringa) gli array possono essere multidimensionali, la chiave e` una combinazione degli indici Esempi: giorni[gennaio] = 31; $1 ~ /^[0-9]/ { quant[$2,data]+=$1;}
Sistemi Operativi - Introduzione 13 Array Ci sono alcuni costrutti e operatori utili per gli array: if(val in array) {...} if((val,val2) in array) {...} for(var in array) {...} delete array; delete array[index]; se si accede a un array con un indice inesistente viene ritornato 0 o la stringa vuota a seconda del contesto.
Sistemi Operativi - Introduzione 14 Stringhe Ci sono alcuni costrutti e funzioni utili per le stringhe: (string1 string2 string3...) Concatenazione di stringhe gsub(r, s [, t]); Sostituisce ogni occorrenza della regexp r con s nella stringa t (o $0 se non ce` t). Un & in s viene sostituito con il valore che fa match. Ritorna il numero di sostituzioni. length(s); Ritorna la lunghezza della stringa s. match(s, r); Ritorna la prima occorrenza di una stringa che fa match con la regexp r nella stringa s.
Sistemi Operativi - Introduzione 15 Stringhe split(s, a [, d]); Suddivide la stringa s in parole secondo il delimitatore d e mette nel vettore ogni elemento. Ritorna il numero di elementi del vettore a. substr(s, i [, n]); Ritorna al massimo n caratteri della stringa s a partire dal carattere i-esimo. Se n non ce` ritorna tutto il resto della stringa a partire da i. toupper(s); tolower(s); Ritornano la stringa s trasformata in maiuscolo (o minuscolo).
Sistemi Operativi - Introduzione 16 Gestione dellI/O Funzioni utili per una gestione avanzata dellI/O: getline [var] [<file]; Carica il record seguente di file (o del file corrente) in var (o in $0). print [str] [>file]; printf(format,...) [>file]; Stampa (formattata) su file (se ce` la redirezione). print stampa un newline alla fine e non vuole le parentesi. system(command); Chiama una shell per eseguire il comando command. exit; Va alla fine del file ed esegue il pattern END se ce`.
Sistemi Operativi - Introduzione 17 getline Lutilizzo tipico di getline e` quello di leggere un secondo file di input prima della elaborazione: BEGIN { while(getline <vocabolario){ voc[$1]=$2; } { for(i=0; i<NF; i++){ if($i in voc) {printf(%s, voc[$i]);} else {printf(%s, $i);} }
Sistemi Operativi - Introduzione 18 Funzioni In AWK si possono definire delle funzioni con la seguente sintassi: function my_function(param1, param2...) { /*actions*/ return val; }... pattern { ret_val = my_function(param1, param2...); }