Successivo: BEGIN/END, Precedente: Espressioni come criteri di ricerca, Su: Panoramica sui criteri di ricerca [Contenuti][Indice]
Un intervallo di ricerca è composto da due criteri di ricerca separati da una virgola, nella forma ‘inizio_intervallo, fine_intervallo’. È usato per individuare una serie di record consecutivi nei file in input. Il primo criterio di ricerca, inizio_intervallo, controlla dove inizia la serie di record, mentre fine_intervallo controlla dove finisce la serie stessa. L’esempio seguente:
awk '$1 == "on", $1 == "off"' miofile
stampa ogni record in miofile incluso tra i due record che iniziano con ‘on’/‘off’, estremi compresi.
Un intervallo di ricerca inizia con la valutazione di inizio_intervallo per ogni record in input. Quando un record soddisfa la condizione inizio_intervallo, l’intervallo di ricerca è attivato e l’intervallo di ricerca include anche quel record. Finché l’intervallo di ricerca rimane attivo, automaticamente vengono trovate corrispondenze in ogni record in input letto. L’intervallo di ricerca verifica anche fine_intervallo per ogni record in input; quando la verifica ha successo, il criterio di ricerca viene disattivato a partire dal record seguente. Quindi il criterio di ricerca torna a controllare inizio_intervallo per ogni nuovo record.
Il record che segnala l’inizio dell’intervallo
di ricerca e quello che segnala la fine di quell’intervallo soddisfano
entrambi il criterio di ricerca. Se non si vuole agire su tali record
si possono scrivere istruzioni if
nella parte azione della regola
per distinguerli dai record che il programma è interessato a trattare.
È possibile che un criterio di ricerca sia attivato e disattivato dallo
stesso record. Se il record soddisfa entrambe le condizioni, l’azione è
eseguita solo su quel record.
Per esempio, si supponga che ci sia un testo tra due separatori identici
(p.es., il simbolo ‘%’), ognuno dei quali sia su una riga a parte, che
dovrebbero essere ignorati. Un primo tentativo potrebbe essere quello di
combinare un intervallo di ricerca che descrive il
testo delimitato con l’istruzione
next
(non ancora introdotta, vedi la sezione L’istruzione next
).
Con quest’istruzione awk
non effettua alcuna azione sul record
corrente e inizia di nuovo a elaborare il successivo record in input.
Un tale programma è simile a questo:
/^%$/,/^%$/ { next } { print }
Questo programma non funziona, perché l’intervallo di ricerca è sia attivato che disattivato dalla prima riga incontrata, quella costituita da un ‘%’. Per ottenere l’effetto desiderato, si scriva il programma nella maniera che segue, utilizzando un flag:
/^%$/ { ignora = ! ignora; next } ignora == 1 { next } # ignora righe quando `ignora' è impostato a 1
In un intervallo di ricerca, la virgola (‘,’) ha la precedenza più bassa tra tutti gli operatori (cioè, è l’ultima a essere valutata). Il programma seguente tenta di combinare un intervallo di ricerca con un altro controllo, più semplice:
echo Yes | awk '/1/,/2/ || /Yes/'
L’intenzione in questo programma è quello di esprimere le condizioni
‘(/1/,/2/) || /Yes/’.
Tuttavia, awk
lo interpreta come se fosse
‘/1/, (/2/ || /Yes/)’.
Questo comportamento non può essere cambiato o evitato; gli intervalli di
ricerca non si possono combinare con altri criteri di ricerca:
$ echo Yes | gawk '(/1/,/2/) || /Yes/' error→ gawk: riga com.:1: (/1/,/2/) || /Yes/ error→ gawk: riga com.:1: ^ syntax error
Come punto di secondaria importanza, nonostante sia stilisticamente poco elegante, lo standard POSIX consente di andare a capo dopo la virgola in un intervallo di ricerca. (a.b.)
Successivo: BEGIN/END, Precedente: Espressioni come criteri di ricerca, Su: Panoramica sui criteri di ricerca [Contenuti][Indice]