Successivo: , Precedente: , Su: Panoramica sui criteri di ricerca   [Contenuti][Indice]


7.1.3 Specificare intervalli di record con i criteri di ricerca

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: , Precedente: , Su: Panoramica sui criteri di ricerca   [Contenuti][Indice]