Successivo: , Su: BEGIN/END   [Contenuti][Indice]


7.1.4.1 Azioni di inizializzazione e pulizia

Una regola BEGIN è eseguita solo una volta, prima che sia letto il primo record in input. Analogamente, una regola END è eseguita solo una volta, dopo che tutto l’input è già stato letto. Per esempio:

$ awk '
> BEGIN { print "Analisi di \"li\"" }
> /li/  { ++n }
> END   { print "\"li\" è presente in", n, "record." }' mail-list
-| Analisi di "li"
-| "li" è presente in 4 record.

Questo programma trova il numero di record nel file in input mail-list che contengono la stringa ‘li’. La regola BEGIN stampa un titolo per il rapporto. Non c’è bisogno di usare la regola BEGIN per inizializzare il contatore n a zero, poiché awk lo fa automaticamente (vedi la sezione Variabili). La seconda regola incrementa la variabile n ogni volta che si legge un record che soddisfa il criterio di ricerca ‘li’. La regola END stampa il valore di n alla fine del programma.

I criteri di ricerca speciali BEGIN ed END non possono essere usati negli intervalli, o con operatori booleani (in effetti, non possono essere combinati con nessun altro operatore). Un programma awk può avere molte regole BEGIN e/o END. Queste sono eseguite nell’ordine in cui compaiono nel programma: tutte le regole BEGIN a inizio programma e tutte le regole END a fine programma. Le regole BEGIN ed END possono apparire in qualsiasi posizione all’interno del programma. Questa funzionalità è stata aggiunta nella versione 1987 di awk ed è inclusa nello standard POSIX. La versione originale (1978) di awk richiedeva che la regola BEGIN fosse posta all’inizio del programma, e la regola END alla fine del programma, e solo una regola per tipo era ammessa. Ciò non è più obbligatorio, ma è una buona idea continuare a seguire questo modello per migliorare l’organizzazione e la leggibilità del programma.

Regole multiple BEGIN ed END sono utili per scrivere funzioni di libreria, poiché ogni file di libreria può avere la sua propria regola BEGIN e/o END per fare la propria inizializzazione e/o pulizia. L’ordine in cui le funzioni di libreria sono menzionate nella riga dei comandi determina l’ordine in cui le rispettive regole BEGIN ed END sono eseguite. Per questo motivi, occorre prestare attenzione nello scrivere tali regole nei file di libreria, in modo che non sia importante l’ordine in cui tali regole vengono eseguite. Vedi la sezione Opzioni sulla riga di comando per maggiori informazioni sull’uso di funzioni di libreria. Vedi la sezione Una libreria di funzioni awk, per parecchie utili funzioni di libreria.

Se un programma awk ha solo regole BEGIN e nessun’altra regola, il programma esce dopo aver eseguito le regole BEGIN.38 Tuttavia, se una regola END esiste, l’intero input è letto, anche se non sono presenti altre regole nel programma. Ciò viene fatto necessariamente per permettere che la regola END faccia uso delle variabili FNR e NR.


Note a piè di pagina

(38)

La versione originale di awk continuava a leggere e ignorare i record in input fino alla fine del file.


Successivo: , Su: BEGIN/END   [Contenuti][Indice]