Il sistema operativo UNIX AWK Niccolò Battezzati <[email protected]> Politecnico di Torino Dip. Automatica e Informatica Sistemi Operativi - Introduzione 1 Introduzione • AWK e` un linguaggio di programmazione di parser inventato nel 1977 da: • A. V. Aho • P. J. Weinberger • B. W. Kernighan • Sintassi simile al C, tranne che... Sistemi Operativi - Introduzione 2 Introduzione • Dove si trova la documentazione: • man awk • http://people.cs.uu.nl/piet/docs/nawk/nawk_toc.html Sistemi Operativi - Introduzione 3 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 4 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 Sistemi Operativi - Introduzione definisce una variabile var e le assegna il valore val 5 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 un’azione non ha pattern, viene eseguita per ciascuna linea del file. Sistemi Operativi - Introduzione 6 Pattern • I pattern possono essere: • /regexp/ • relational_expr espressioni regolari confronti Esempi: • /^[Pp]ippo\>/ • $1 == “Pippo” || $1 == “pippo” • $1 ~ /[Pp]pippo\>/ Sistemi Operativi - Introduzione 7 Operatori di confronto • Operatori di confronto: • ==, != • <, >, <=, >= • ~ fa match con la regexp • !~ NON fa match con la regexp • &&, ||, ! operatori logici Sistemi Operativi - Introduzione 8 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 9 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 • l’operatore $ 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 10 Variabili predefinite • Variabili predefinite: • $0 il record corrente • $1,$2,...i campi del record corrente • NF numero di campi del record corrente • $NF l’ultimo campo del record corrente • FS il carattere separatore dei campi • RS il carattere separatore dei record Sistemi Operativi - Introduzione 11 Array • Gli array sono delle mappe che usano l’indice come chiave. L’indice 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 12 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 13 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 c’e` 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 14 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 c’e` 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 15 Gestione dell’I/O • Funzioni utili per una gestione avanzata dell’I/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 c’e` 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 c’e`. Sistemi Operativi - Introduzione 16 getline • L’utilizzo 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 17 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 ...); } Sistemi Operativi - Introduzione 18