LeoBenelli
Personal WebPage


LINGUAGGIO GAWK/AWK

 

Awk (nome dalle iniziali dei suoi autori) e' un'utility/linguaggio che permette di analizzare file di testo nella fattispecie file di log con le informazioni ordinate in colonne.

 

Awk permette di usare sia il semplice invio con parametri da linea di comando, sia per elaborazioni piu' complicate la creazione di script. Tra i vari parametri quelli determinanti sono :

 

awk -F: <pattern-azione> <file di testo> ( esempio 'awk $1=="root" {print $2}' /var/log/cron )
awk -f <script> <file di testo>

 

Il parametro -F e' seguito da un carattere che e' il separatore di colonne; pattern-azione e' un espressione che descrive cosa fare e come rappresentare gli elementi delle colonne; -f e' seguito dal nome dello script da usare; File di testo indica il file da elaborare, l'output verra' effettuato sullo STDOUT quindi nessun cambiamento sara' apportato al file stesso.

 

Per effettuare una semplice ricerca di una parola all'interno del file si usa /pattern/{azione}esempio :


awk '/root/{print $2}' /etc/passwd
Per effettuare una verifica su un determinato campo si usa :
awk '$2=="xxx" {print $2}' /etc/passwd

 

In caso di costruzione di uno script esistono tre sezioni :

 

BEGIN { .... }
{ .... }
END { .... }

 

La sezione BEGIN verra' eseguita all'inizio.


la seconda serie di parentesi graffe sara' eseguita ad ogni rigo di elaborato ed e' qui che e' possibile inserire condizioni ecc...


La sezione END verra' inserita al termine, magari per visualizzare totali elaborati nelle sezioni precedenti.La sintassi del linguaggio e' molto simile al C, e la gestione dei campi del file sorgente e' simile al passaggio dei parametri ad uno script BASH.

 

 

Variabili Predefinite

Descrizione

NR

Numero sequenziale del record in input corrente.

FNR

Numero di record letti dal file corrente (in caso di lettura di piu' file insieme )

NF

Numero dei campi del record corrente.

$0

Contenuto dell'intero record.

$1...$N

Contenuto dei Campi nel record corrente.

FS

Delimitatore dei campi di input (di default spazio bianco o tabulazione)

OFS

Delimitatore dei campi di output (di default spazio bianco )

RS

Delimitatore del record di input (di default nuova riga)

ORS

Delimitatore del record di output (di default nuova riga)

OFMT

Formato di output dei numeri di default %g

FILENAME

Nome del file di input corrente.

 

Funzioni Predefinite

Descrizione

Length(str)

Restituisce il numero di caratteri della stringa passata, se non viene passato niente restituisce la lunghezza di $0.

Int(param)

Restituisce la porzione intera del parametro, se inizia con un valore numerico altrimenti restituisce 0

Index(str1,str2)

Restituisce l'indice di str2 in str1, se str2 non trovato restituisce 0

Split(str,arr,del)

Inserisce nell'array arr il campo di str delimitato da del

Split()

Restituisce il numero di campi delimitati

Substr(str,pos,len)

Restituisce la sottostringa di str che inizia in corrispondenza della posizione pos lunga len caratteri.

Sqrt(x)

Restituisce la radice quadrata

Rand(x)

Restituisce un numero causale tra 0 e 1

Srand(x)

Imposta x come base per rand.

           

Comandi Predefiniti

Descrizione

Print ...

Es print $1 stampa il contenuto del primo campo

Printf('layout',var1,var2...)

Come in C e' possibile scegliere il layout della stringa e passare le variabili da usare per riempirne il contenuto.

Elementi di formato es. %5s

Descrizione

d

Un intero

e

Virgola mobile in notazione scientifica

f

Virgola mobile in notazione convenzionale

g

Virgola mobile in notazione scientifica o convenzionale a seconda di quale e' piu' corta

o

Senza segno in formato ottale

s

Stringa

x

Senza segno in formato esadecimale

Mettendo un valore tra la percentuale e l'elemento si indica di quanti caratteri deve essere composto il risultato se l'allineamento e' a destra mettere un segno meno per allineare a sinistra es. %-5s
Con valori numerici e' possibile indicare la precisione indicando dopo il punto il numero di decimali es. %5.2f

Esistono una serie di codici Escape per indicare caratteri particolari in output.

Caratteri Escape per output

Descrizione

\a

Genera un suono.

\b

Backspace

\f

Formfeed (Salto Pagina)

\n

Nuova riga

\r

A capo

\t

Tabulazione

\v

Tabulazione verticale

\....

Ogni carattere .... es. \” Stampa delle virgolette

If(condizione) { ... }
else
{ ... }

Condizione di IF

While (espressione) { ... }

Ciclo while ( continua il ciclo fino a quando l'espressione e' verificata

For (inizializzazione; espressione; incremento) { ... }

Condizione di FOR

Next

Indica a awk di passare al record successivo e riparte dall'inizio

 

 

Vettori

Descrizione

Var[num]=....

Indica a awk di inizializzare un vettore con il valore ....

 

 

Operatori di confronto e aritmetici

Descrizione

== != > < >= <=

Operatori di confronto. (Uguale, diverso, maggiore, minore, maggiore uguale, minore uguale)

+ - * / ^ %

Operatori aritmetici (Piu, meno, per, diviso, esponente, resto)

 

 

Metacaratteri

Descrizione

~

La tilde permette di controllare la corrispondenza di un campo con un pattern es. :
awk “$5 ~/^f/{print $1}” /etc/passwd (Stampa tutti gli utenti che iniziano per f)
awk “$5 !~/^f/{print $1}” /etc/passwd (Stampa tutti gli utenti che NON iniziano per f)

 

Qui di seguito un semplice ( ed inutile ) esempio di Script : eseguibile con :
awk -f test.awk /var/log/secure

 

# Test.awk
BEGIN {
print "INIZIO : "
xriga = 0
}
{
++xriga
if(xriga < 10) {
xappo = $3
printf( "l'ora e' %s \n", xappo)
}
END {
print "FINE : "
}

 

Nella composizione del pattern e' possibile usare anche espressioni regolari.