Successivo: Due regole, Precedente: File dati di esempio, Su: Per iniziare [Contenuti][Indice]
I seguenti comandi eseguono un semplice programma awk
che cerca
nel file in input mail-list la stringa di caratteri ‘li’ (una
sequenza di caratteri è solitamente chiamato una stringa;
il termine stringa è basato su un uso linguistico, del tipo
“una stringa di perle” o “una stringa di luci decorative”):
awk '/li/ { print $0 }' mail-list
Quando si incontra una riga che contiene ‘li’, la si stampa, perché ‘print $0’ significa "stampa la riga corrente". (Lo scrivere solo ‘print’ ha lo stesso significato, quindi avremmo anche potuto limitarci a fare così).
Si sarà notato che delle barre (‘/’) delimitano la stringa ‘li’
nel programma awk
. Le barre indicano che ‘li’ è il
modello da ricercare. Questo tipo di notazione è definita come
espressione regolare, e sarà trattata più avanti in maggior dettaglio
(vedi la sezione Espressioni regolari).
Il modello può corrispondere anche solo a una parte di una parola.
Ci sono
apici singoli che racchiudono il programma awk
in modo che la
shell non interpreti alcuna parte di esso come un carattere speciale della
shell.
Questo è quello che il programma stampa:
$ awk '/li/ { print $0 }' mail-list -| Amelia 555-5553 amelia.zodiacusque@gmail.com F -| Broderick 555-0542 broderick.aliquotiens@yahoo.com R -| Julie 555-6699 julie.perscrutabor@skeeve.com F -| Samuel 555-3430 samuel.lanceolis@shu.edu A
In una regola awk
, il criterio di selezione o l’azione possono
essere omessi, ma non entrambi. Se il criterio è omesso, l’azione viene
applicata a ogni riga dell’input.
Se l’azione viene omessa, per default si stampano tutte le righe che
sono individuate dal criterio di selezione.
Quindi, si potrebbe omettere l’azione (l’istruzione print
e le
graffe) nell’esempio precedente e il risultato sarebbe lo stesso:
awk
stampa tutte le righe che corrispondono al criterio di
ricerca ‘li’. Per confronto, omettendo l’istruzione print
ma
lasciando le graffe si richiede un’azione nulla, che non fa nulla (cioè non
stampa alcuna riga).
Molti programmi awk
pratici sono lunghi solo una o due righe.
Qui sotto troviamo una collezione di programmi utili e corti, per iniziare.
Alcuni di questi programmi contengono elementi del linguaggio che non sono
ancora stati spiegati. (La descrizione del programma fornisce una buona
idea di quel che si vuole ottenere, ma occorre leggere il resto del
Documento per divenire esperti in awk
!)
Molti degli esempi usano un file-dati di nome data. Questo serve solo
a indicare la posizione del nome; se questi programmi devono venir usati per
se stessi, sostituire i propri nomi-file al posto di data.
Per futura memoria, si noti che spesso c’è più di un modo per fare qualcosa
in awk
. In un altro momento, si potrebbe tornare a guardare questi
esempi per vedere se si riescono a trovare modi differenti per fare le stesse
cose mostrate qui appresso:
awk 'length($0) > 80' data
L’unica regola presente ha un’espressione di relazione come modello e non ha azione — quindi applica l’azione di default, stampando il record.
awk '{ if (length($0) > max) max = length($0) } END { print max }' data
Il codice associato a END
viene eseguito dopo che tutto
l’input è stato letto; è l’altra faccia della medaglia di BEGIN
.
expand data | awk '{ if (x < length($0)) x = length($0) } END { print "la lunghezza massima di una riga è" x }'
Questo esempio è leggermente diverso da quello precedente:
l’input è l’output del comando expand
, che cambia i TAB
in spazi, in modo che le larghezze confrontate siano quelle che sarebbero
qualora le si stampasse, e non il numero dei caratteri di input su ogni
riga. [il carattere TAB occupa un byte nel file, ma può generare fino a
otto spazi bianchi in fase di stampa.]
awk 'NF > 0' data
Questa è una maniera facile per eliminare le righe vuote dal file (o piuttosto, per creare un nuovo file, simile al vecchio, ma nel quale le linee vuote sono state tolte).
awk 'BEGIN { for (i = 1; i <= 7; i++) print int(101 * rand()) }'
ls -l elenco-file | awk '{ x += $5 } END { print "byte totali: " x }'
ls -l elenco-file | awk '{ x += $5 } END { print "K-byte totali:", x / 1024 }'
awk -F: '{ print $1 }' /etc/passwd | sort
awk 'END { print NR }' data
awk 'NR % 2 == 0' data
Se aveste usato invece l’espressione ‘NR % 2 == 1’, il programma avrebbe stampato le righe dispari.
Successivo: Due regole, Precedente: File dati di esempio, Su: Per iniziare [Contenuti][Indice]