LeoBenelli
|
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 |
|||
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) { ... } |
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. : |
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.