Successivo: Altre funzionalità, Precedente: Maggiore sofisticazione, Su: Per iniziare [Contenuti][Indice]
awk
Molto spesso, ogni riga di un programma awk
è un’istruzione a sé
stante o una regola isolata, come:
awk '/12/ { print $0 } /21/ { print $0 }' mail-list inventory-shipped
Comunque, gawk
ignora i ritorni a capo dopo ognuno di questi
simboli e istruzioni:
, { ? : || && do else
Un ritorno a capo in ogni altro punto del programma è considerato come la fine di un’istruzione.9
Volendo dividere una sola istruzione su due righe in un punto in cui andando a capo sarebbe considerata conclusa, è possibile continuare nella riga successiva terminando la prima riga con un carattere di barra inversa (‘\’). La barra inversa dev’essere l’ultimo carattere sulla riga, per essere riconosciuto come un carattere di continuazione. Una barra inversa seguita da un ritorno a capo è consentita in ogni parte dell’istruzione, anche in mezzo a una stringa o a un’espressione regolare. Per esempio:
awk '/Questa espressione regolare è troppo lunga, quindi\ la continuiamo sulla riga seguente/ { print $1 }'
Non abbiamo quasi mai usato la continuazione tramite barra inversa nei nostri
programmi di esempio. gawk
non pone limiti alla lunghezza di
una riga, quindi la continuazione tramite barra inversa non è mai strettamente
necessaria; serve soltanto a migliorare la leggibilità del programma.
Per la stessa ragione, ma anche per amore di chiarezza, abbiamo tenuto
concise molte istruzioni nei programmi presentati in questo Documento.
La continuazione tramite barra inversa è molto utile quando il proprio
programma awk
si trova in un file sorgente separato, invece di
essere immesso nella riga di comando. Si noti anche che molte implementazioni
di awk
presentano delle differenze su dove è possibile usare
la continuazione tramite barra inversa. Per esempio, potrebbero non
consentire di spezzare una costante di tipo stringa usando la continuazione
tramite barra inversa. Quindi, per ottenere la massima portabilità dei
propri programmi awk
, è meglio non spezzare le righe nel
mezzo di un’espressione regolare o di una stringa.
ATTENZIONE: la continuazione tramite barra inversa non funziona come sopra descritto nella C shell. Funziona per programmi
awk
contenuti in file e per programmi sulla riga di comando, ammesso che si stia usando una shell conforme a POSIX, come la Unix Bourne shell o Bash. Ma la C shell si comporta in maniera diversa! In quel caso, occorre usare due barre inverse consecutive, in fondo alla riga. Si noti anche che quando si usa la C shell ogni andata a capo nel vostro programmaawk
deve essere indicata con una barra inversa. Per esempio:% awk 'BEGIN { \ ? print \\ ? "ciao, mondo" \ ? }' -| ciao, mondoQui, il ‘%’ e il ‘?’ sono i prompt primario e secondario della C shell, analogamente a quelli usati nella shell standard ‘$’ e ‘>’.
Si confronti l’esempio precedente, come viene scritto in una shell conforme a POSIX:
$ awk 'BEGIN { > print \ > "ciao, mondo" > }' -| ciao, mondo
awk
è un linguaggio orientato alla riga. L’azione relativa a ogni
regola deve iniziare sulla stessa riga del criterio di selezione. Per avere
criterio di selezione e azione su righe separate, si
deve usare la continuazione tramite barra inversa; non si può fare
diversamente.
Un’altra cosa da tener presente è che la continuazione tramite barra inversa e
i commenti non possono essere frammisti. Non appena awk
incontra
un ‘#’ che inizia un commento, ignora tutto il resto della riga.
Per esempio:
$ gawk 'BEGIN { print "Non allarmarti" # una amichevole \ > regola BEGIN > }' error→ gawk: riga com.:2: regola BEGIN error→ gawk: riga com.:2: ^ syntax error
In questo caso, parrebbe che la barra inversa continui il commento sulla riga
successiva. Invece, la combinazione barra inversa-ritorno a capo non viene
per nulla notata, in quanto “nascosta” all’interno del commento. Quindi,
il BEGIN
è marcato come errore di sintassi.
Quando le istruzioni awk
all’interno di una regola sono brevi, si
potrebbe metterne più d’una su una riga sola. Ciò è possibile separando le
istruzioni con un punto e virgola (‘;’).
Questo vale anche per le regole stesse.
Quindi, il programma visto all’inizio di
questa
sezione
poteva essere scritto anche così:
/12/ { print $0 } ; /21/ { print $0 }
NOTA BENE: La possibilità che più regole coesistano sulla stessa riga, se sono separate da un punto e virgola, non esisteva nel linguaggio
awk
originale; è stata aggiunta per congruenza con quanto è consentito per le istruzioni all’interno di un’azione.
Il ‘?’ e i ‘:’ elencati sopra sono
usati nell’espressione condizionale in tre parti descritta in
Espressioni condizionali.
Il cambio di riga dopo ‘?’ e i ‘:’ è un’estensione minore in
gawk
; specificando --posix come opzione
(vedi la sezione Opzioni sulla riga di comando), quest’estensione non è valida.
Successivo: Altre funzionalità, Precedente: Maggiore sofisticazione, Su: Per iniziare [Contenuti][Indice]