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
Scarica

so_1011_5