180 likes | 313 Views
Il sistema operativo UNIX AWK. Niccol ò Battezzati <niccolo.battezzati@polito.it> Politecnico di Torino Dip. Automatica e Informatica. 1. Sistemi Operativi - Introduzione. Introduzione. AWK e` un linguaggio di programmazione di parser inventato nel 1977 da : A. V. A ho
E N D
Il sistema operativo UNIX AWK Niccolò Battezzati<niccolo.battezzati@polito.it> Politecnico di Torino Dip. Automatica e Informatica 1 Sistemi Operativi - Introduzione
Introduzione • AWK e` un linguaggiodiprogrammazionedi parser inventatonel 1977 da: • A. V. Aho • P. J. Weinberger • B. W. Kernighan • Sintassi simile al C, tranneche... ... l’indicedeivettori parte da 1!!! 2 Sistemi Operativi - Introduzione
Introduzione • Dove sitrova la documentazione: • man awk • http://people.cs.uu.nl/piet/docs/nawk/nawk_toc.html 3 Sistemi Operativi - Introduzione
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”). 4 Sistemi Operativi - Introduzione
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 5 Sistemi Operativi - Introduzione
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. 6 Sistemi Operativi - Introduzione
Pattern • I pattern possono essere: • /regexp/ espressioni regolari • relational_expr confronti • Esempi: • /^[Pp]ippo\>/ • $1 == “Pippo” || $1 == “pippo” • $1 ~ /[Pp]pippo\>/ 7 Sistemi Operativi - Introduzione
Operatori di confronto • Operatori di confronto: • ==, != • <, >, <=, >= • ~ fa match con la regexp • !~ NON fa match con la regexp • &&, ||, ! operatori logici 8 Sistemi Operativi - Introduzione
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);} 9 Sistemi Operativi - Introduzione
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. 10 Sistemi Operativi - Introduzione
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 11 Sistemi Operativi - Introduzione
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;} 12 Sistemi Operativi - Introduzione
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. 13 Sistemi Operativi - Introduzione
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. 14 Sistemi Operativi - Introduzione
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). 15 Sistemi Operativi - Introduzione
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`. 16 Sistemi Operativi - Introduzione
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);} • } • } 17 Sistemi Operativi - Introduzione
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 ...); • } 18 Sistemi Operativi - Introduzione