Comando awk
Scopo
Individua le righe nei file che corrispondono a un modello ed esegue azioni specificate su tali righe.
Sintassi
awk [ -FEre ] [ -v Assegnazione ] ... { -f File di programma | 'Programma' }
[ [ File ... | Assegnazione... ] ] ...
Descrizione
Il comando awk utilizza una serie di istruzioni fornite dall'utente per confrontare una serie di
file, una riga alla volta, con espressioni regolari estese fornite dall'utente. Quindi le azioni vengono eseguite sulla
riga che corrisponde alle espressioni regolari estese.
La ricerca del modello del comando awk è più generale del comando
grep e consente all'utente di eseguire più azioni sulle righe del testo di immissione. Il linguaggio di
programmazione del comando awk non richiede compilazione e consente all'utente di utilizzare variabili, funzioni numeriche, funzioni di stringa
e operatori logici.
Il comando awk è influenzato dalle variabili di ambiente LANG, LC_ALL, LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_NUMERIC, NLSPATH e PATH.
In questa sezione vengono descritti i seguenti argomenti:
Immissione per il comando awk
Il comando awk prevede due tipi di immissione: file del testo di immissione e istruzioni del
programma.
File del testo di immissione
La ricerca e le opzioni vengono eseguite sui file del testo di immissione. I file vengono specificati tramite:
- Specifica della variabile File sulla riga comandi.
- Modifica delle variabili speciali ARGV e ARGC.
- Definizione di un'immissione standard in assenza della variabile File.
Se si specificano più file con la variabile File, i file vengono elaborati nell'ordine
specificato.
Istruzioni di programma
Le istruzioni fornite dall'utente controllano le azioni del comando awk. Tali istruzioni provengono dalla variabile `Programma' sulla riga comandi o da un file specificato dall'indicatore -f insieme alla variabile File di programma. Se si specificano più file di programma, i file vengono concatenati nell'ordine specificato e si utilizza l'ordine
di istruzioni risultante.
Emissione per il comando awk
Il comando awk produce tre tipi di emissione dai dati all'interno di un file del testo di
immissione:
- I dati selezionati possono essere visualizzati nell'emissione standard, senza modifica del file di immissione.
- E' possibile modificare parti selezionate del file di immissione.
- I dati selezionati possono essere modificati e visualizzati nell'emissione standard, con o senza modifica del
contenuto del file di immissione.
Tutti questi tipi di emissione possono essere eseguiti sullo stesso file. Il linguaggio di programmazione riconosciuto
dal comando awk consente all'utente di reindirizzare l'emissione.
Elaborazione file con registrazioni e campi
I file vengono elaborati nel seguente modo:
- Il comando awk esegue la scansione delle relative istruzioni ed esegue le azioni specificate
prima della lettura del file di immissione.
L'istruzione BEGIN nel linguaggio di programmazione awk consente all'utente di specificare una serie di
istruzioni da eseguire prima della lettura della prima registrazione. Ciò è particolarmente utile per l'inizializzazione
di variabili speciali.
- Una registrazione viene letta dal file di immissione.
Una registrazione è una serie di dati separati da un
saparatore di registrazioni. Il valore predefinito per il separatore di registrazione è il carattere di nuova riga,
che rende ogni riga nel file una registrazione separata. E' possibile modificare il separatore di registrazione impostando
la variabile speciale RS.
- La registrazione viene confrontata rispetto a ogni modello specificato dalle istruzioni del comando awk.
Le istruzioni del comando possono specificare di confrontare uno specifico campo all'interno di una
registrazione. Per impostazione predefinita, i campi sono separati da uno spazio (spazi o caratteri di tabulazione). A ogni campo fa riferimento una
variabile di campo.
Al primo campo in una registrazione viene assegnata la variabile $1, al secondo campo viene assegnata la variabile
$2 e via di seguito. L'intera registrazione viene assegnata alla variabile
$0.
E' possibile modificare il separatore di campo utilizzando l'indicatore -F
sulla riga comandi o impostando la variabile speciale FS. E' possibile impostare la variabile speciale FS sui valori: vuoto, carattere
singolo o espressione regolare estesa.
- Se la registrazione corrisponde a un modello, qualsiasi azione associata a tale modello viene eseguita sulla
registrazione.
- Dopo avere confrontato la registrazione con ogni modello ed eseguito tutte le azioni specificate, la successiva
registrazione viene letta dall'immissione; il processo viene ripetuto finché tutte le registrazioni non vengono
lette dal file di immissione.
- Se sono stati specificati più file, il file successivo viene quindi aperto e il processo ripetuto finché non sono stati
letti tutti i file di immissione.
- Dopo avere letto l'ultima registrazione nell'ultimo file, il comando awk esegue le istruzioni specificate dopo l'elaborazione dell'immissione.
L'istruzione END nel linguaggio di programmazione awk consente all'utente di specificare le azioni
da eseguire dopo la lettura dell'ultima registrazione. Ciò è particolarmente utile per l'invio di messaggi
relativi al lavoro completato dal comando awk.
Linguaggio di programmazione del comando awk
Il linguaggio di programmazione del comando awk consiste nelle istruzioni nel formato:
Modello { Azione }
Se una registrazione corrisponde al modello specificato o contiene un campo che corrisponde al modello, viene eseguita
l'azione associata. E' possibile specificare un modello senza azione, nel cui caso l'intera riga contenente il modello
viene scritta nell'emissione standard. Un'azione specificata senza modello viene eseguita per ogni registrazione di
immissione.
Modelli
Esistono quattro tipi di modelli utilizzati nella sintassi del linguaggio del comando awk:
Espressioni regolari
Le espressioni regolari estese utilizzate dal comando awk sono simili a quelle utilizzate
dal comando grep.
Il formato più semplice di un'espressione regolare estesa è una stringa di caratteri racchiusa tra barre. Per un esempio, si supponga
che un file denominato testfile abbia il seguente contenuto:
smawley, andy
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis
Immettendo la seguente riga di comando:
awk '/smi/' testfile
viene visualizzata la seguente emissione di tutte le registrazioni che contenevano una ricorrenza della stringa
smi. In questo esempio, il comando di programma
'/smi/' per awk è un modello senza azione. L'emissione è:
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis
I seguenti caratteri speciali vengono utilizzati per formare espressioni regolari estese:
| Carattere |
Funzione |
|
+ |
Specifica una corrispondenza di stringhe se una o più ricorrenze dell'espressione regolare estesa o di caratteri
che precede il + (più) sono all'interno di una stringa. La riga comandi:
awk '/smith+ern/' testfile
stampa nell'emissione standard qualsiasi registrazione che conteneva una stringa con i caratteri
smit, seguita da uno o più caratteri h e che terminava con i caratteri ern. L'emissione in questo esempio è:
smithern, harry
smithhern, anne |
|
? |
Specifica una corrispondenza di stringa se zero o una ricorrenza dell'espressione regolare estesa o di caratteri
che precede il ? (punto interrogativo) si trova all'interno della stringa. La riga comandi:
awk '/smith?/' testfile
stampa nell'emissione standard tutte le registrazioni che contengono i caratteri smit, seguiti da zero o da un'istanza del carattere h. L'emissione in questo esempio è:
smith, alan
smithern, harry
smithhern, anne
smitters, alexis |
|
| |
Specifica una corrispondenza di stringa se una delle stringhe separate da |
(riga verticale) è all'interno della stringa. La riga comandi:
awk '/allen
|
alan /' testfile
visualizza la seguente emissione standard di tutte le registrazioni che contenevano la stringa
allen o alan. L'emissione in questo esempio è:
smiley, allen
smith, alan |
|
( ) |
Raggruppa le stringhe in espressioni regolari. La riga comandi:
awk '/a(ll)?(nn)?e/' testfile
visualizza la seguente emissione standard di tutte le registrazioni con la stringa
ae, alle, anne o allnne. L'emissione in questo esempio è:
smiley, allen
smithhern, anne |
|
{m} |
Specifica una corrispondenza di stringa se tutte le ricorrenze m del modello
sono all'interno della stringa. La riga comandi:
awk '/l{2}/' testfile
visualizza l'emissione standard
smiley, allen |
|
{m,} |
Specifica una corrispondenza di stringa se almeno le ricorrenze m del modello
sono all'interno della stringa. La riga comandi:
awk '/t{2,}/' testfile
visualizza l'emissione standard:
smitters, alexis |
|
{m, n} |
Specifica una corrispondenza di stringa se le ricorrenze del modello tra m e n, incluse,
sono all'interno della stringa (in cui m <= n).
La riga comandi:
awk '/er{1, 2}/' testfile
visualizza l'emissione standard:
smithern, harry
smithern, anne
smitters, alexis |
|
[Stringa] |
Significa che l'espressione regolare corrisponde a qualsiasi carattere specificato dalla variabile
Stringa all'interno delle parentesi quadre.
La riga comandi:
awk '/sm[a-h]/' testfile
visualizza un'emissione standard di tutte le registrazioni con i caratteri sm seguiti da qualsiasi carattere in ordine alfabetico da
a a h. L'emissione in questo esempio è:
smawley, andy |
|
[^ Stringa] |
Un ^ (caret) all'interno di [ ] (parentesi quadre) e all'inizio della stringa specificata indica
che l'espressione regolare non corrisponde ad alcun carattere tra parentesi quadre. Quindi la riga comandi:
awk '/sm[^a-h]/' testfile
visualizza l'emissione standard:
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis |
|
~,!~ |
Indica un'espressione condizionale in cui una variabile specificata corrisponde (tilde) o non corrisponde
(tilde, punto esclamativo) all'espressione regolare.
La riga comandi:
awk '$1 ~ /n/' testfile
visualizza un'emissione standard di tutte le registrazioni il cui primo campo conteneva il carattere
n. L'emissione in questo esempio è:
smithern, harry
smithhern, anne |
|
^ |
Indica l'inizio di un campo o di una registrazione. La riga comandi:
awk '$2 ~ /^h/' testfile
visualizza la seguente emissione standard di tutte le registrazioni con
il carattere h come primo carattere del secondo campo. L'emissione in questo esempio è:
smithern, harry |
|
$ |
Indica la fine di un campo o di una registrazione. La riga comandi:
awk '$2 ~ /y$/' testfile
visualizza la seguente emissione standard di tutte le registrazioni con
il carattere y come ultimo carattere del secondo campo. L'emissione in questo esempio è:
smawley, andy
smithern, harry |
|
. (punto) |
Indica un carattere eccetto il carattere di nuova riga alla fine di uno spazio. La riga comandi:
awk '/a..e/' testfile
visualizza la seguente emissione standard di tutte le registrazioni con
i caratteri a ed e separati da due caratteri.
L'emissione in questo esempio è:
smawley, andy
smiley, allen
smithhern, anne |
|
*(asterisco) |
Indica zero o più caratteri. La riga comandi:
awk '/a.*e/' testfile
visualizza la seguente emissione standard di tutte le registrazioni con
i caratteri a ed e separati da zero o più caratteri. L'emissione in questo esempio è:
smawley, andy
smiley, allen
smithhern, anne
smitters, alexis |
|
\ (barra retroversa) |
Il carattere escape. Quando preceduto da qualsiasi carattere con significato speciale in espressioni regolari
estese, il carattere escape rimuove qualsiasi significato speciale per il carattere. Ad esempio, la riga comandi:
/a\/\//
corrisponde al modello
//, poiché le barre retroverse negano il significato solito della barra come delimitatore dell'espressione regolare. Per specificare la barra retroversa come carattere,
utilizzare una doppia barra retroversa. Esaminare la seguente voce nelle sequenze di escape per ulteriori informazioni
sulla barra retroversa e sui relativi utilizzi. |
Sequenze di Escape riconosciute
Il comando awk riconosce la maggior parte delle sequenze di escape
utilizzate nelle convenzioni del linguaggio C, oltre che numerose sequenze utilizzate come caratteri speciali
dal comando awk. Le sequenze di escape sono:
| Sequenza di Escape |
Caratteri rappresentati |
|
\" |
carattere \" (doppio apice) |
|
\/ |
carattere / (barra) |
|
\ddd |
Carattere la cui codifica è rappresentata da un numero intero di ottali a una, due o tre cifre, dove
d rappresenta una cifra ottale |
|
\\ |
carattere \ (barra retroversa) |
|
\a |
Carattere di avviso |
|
\b |
Carattere barra retroversa |
|
\f |
Carattere di ritorno a capo |
|
\n |
Carattere di nuova riga (vedere nota seguente) |
|
\r |
Carattere di ritorno a capo |
|
\t |
Carattere di tabulazione |
|
\v |
Tabulazione verticale. |
Nota:
eccetto che nelle funzioni incorporate gsub, match, split e sub, la corrispondenza di espressioni regolari estese
si basa su registrazioni standard. I caratteri separatori di registrazione (il carattere di nuova riga per impostazione
predefinita) non possono essere incorporati nell'espressione e nessuna espressione corrisponde a tali caratteri. Se il separatore
di registrazione non è un carattere di nuova riga, è possibile stabilire una corrispondenza con il carattere di nuova riga. Nelle quattro funzioni incorporate
specificate, la corrispondenza si basa sulle stringhe di testo e qualsiasi carattere (incluso il separatore di registrazioni)
può essere incorporato nel modello, in modo che il modello corrisponda al carattere appropriato. Tuttavia, in tutta la corrispondenza
di espressioni regolari con il comando awk, l'utilizzo di uno o più caratteri NULL nel modello produce risultati non definiti.
Espressioni di relazione
Gli operatori di relazione < (minore di), > (maggiore
di), <= (minore di o uguale a), >= (maggiore di o uguale a), = = (uguale
a) e ! = (non uguale a) possono essere utilizzati per formare i modelli. Ad esempio, il modello:
$1 < $4
corrisponde alle registrazioni quando il primo campo è minore del quarto campo. Gli operatori
di relazione gestiscono anche i valori di stringa. Ad esempio:
$1 =! "q"
corrisponde a tutte le registrazioni in cui il primo campo non è q. E' possibile stabilire una corrispondenza tra i valori di stringa e i valori di ordinamento. Ad esempio:
$1 >= "d"
corrisponde a tutte le registrazioni in cui il primo campo inizia con un carattere
a, b, c o d. Se non viene fornita nessun'altra informazione, le
variabili di campo sono confrontate con i valori di stringa.
Combinazioni di modelli
E' possibile combinare i modelli utilizzando tre opzioni:
- Gli intervalli vengono specificati da due modelli separati da una
, (virgola). Le azioni vengono eseguite su ogni registrazione a partire da quella corrispondente al primo
modello e continuando con la registrazione corrispondente al secondo modello. Ad esempio:
/begin/,/end/
corrisponde alla registrazione contenente la stringa begin e ogni registrazione tra questa e la registrazione contenente la stringa end, inclusa la registrazione contenente la stringa end.
- Le parentesi ( ) raggruppano i modelli.
- Gli operatori booleani || (or), && (and) e ! (not) combinano i modelli in espressioni
che corrispondono se hanno il valore true, altrimenti non corrispondono.
Ad esempio, il modello:
$1 == "al" && $2 == "123"
corrisponde alle registrazioni in cui il primo campo è al e il secondo campo è 123.
Modelli BEGIN ed END
Le azioni specificate con il modello BEGIN vengono eseguite prima che venga
letta qualsiasi immissione. Le azioni specificate con il modello END vengono eseguite dopo la lettura dell'intera immissione. Più modelli BEGIN e END sono consentiti ed elaborati nell'ordine specificato. Un modello
END può precedere un modello
BEGIN all'interno delle istruzioni del programma.
Se un programma consiste solo in istruzioni BEGIN, le azioni vengono eseguite e non viene letta alcuna
immissione. Se un programma consiste solo in istruzioni END, l'intera immissione viene letta prima che venga eseguita qualsiasi azione.
Azioni
Esistono diversi tipi di istruzioni di azioni:
Istruzioni di azione
Le istruzioni di azione sono racchiuse tra { } (parentesi graffe). Se si specificano le istruzioni
senza modello, queste vengono eseguite su ogni registrazione. E' possibile specificare più azioni all'interno delle parentesi
graffe, ma queste devono essere specificate tramite caratteri di nuova riga o
; (punti e virgola) e le istruzioni vengono elaborate nell'ordine in cui vengono visualizzate.
Le istruzioni di azione
includono:
- Istruzioni aritmetiche
- Gli operatori matematici + (più), - (meno), / (divisione), ^ (elevazione a potenza),
* (moltiplicazione), % (percentuale) vengono utilizzati nel formato:
Espressione Operatore Espressione
Quindi, l'istruzione:
$2 = $1 ^ 3
assegna il valore del primo campo elevato alla terza potenza al secondo campo.
- Istruzioni unarie
- Il - (meno) unario e il + (più) unario operano come nel linguaggio di programmazione C:
+Espressione o -Espressione
- Istruzioni di incremento e decremento
- Le istruzioni di pre-incremento e pre-decremento operano come nel linguaggio
di programmazione C:
++Variabile o --Variabile
Le istruzioni di post-incremento e post-decremento operano come nel linguaggio
di programmazione C:
Variabile++ o Variabile--
- Istruzioni di assegnazione
- Gli operatori di assegnazione += (aggiunta), -= (sottrazione), /= (divisione)
e *= (moltiplicazione) operano come nel linguaggio di programmazione C, con il formato:
Variabile += Espressione
Variabile -= Espressione
Variabile /= Espressione
Variabile *= Espressione
Ad esempio, l'istruzione:
$1 *= $2
moltiplica la variabile di campo $1 per la variabile di campo $2 e quindi assegna il nuovo valore a $1.
Gli operatori di assegnazione ^= (elevazione a potenza)
e %= (percentuale) hanno il formato:
Variabile1^=Espressione1
E
Variabile2%=Espressione2
e sono equivalenti alle istruzioni del linguaggio di programmazione C:
Variabile1=pow(Variabile1, Espressione1)
E
Variabile2=fmod(Variabile2, Espressione2)
dove pow è la routine secondaria pow e fmod è la routine secondaria fmod.
- Istruzioni di concatenamento stringa
- E' possibile concatenare i valori di stringa indicandoli uno accanto all'altro. Ad esempio:
$3 = $1 $2
assegna il
concatenamento delle stringhe nelle variabili di campo $1 e $2 alla variabile di campo $3.
Funzioni incorporate
Il linguaggio del comando awk utilizza funzioni aritmetiche, funzioni di stringhe
e funzioni generali. L'istruzione di routine secondaria di chiusura è necessaria se si intende scrivere un file, quindi
leggerlo in un secondo momento nello stesso programma.
Funzioni aritmetiche
Le seguenti funzioni aritmetiche eseguono le stesse azioni delle routine secondarie in linguaggio C
con lo stesso nome:
| Funzione |
Operazione |
|
atan2( y, x ) |
Restituisce l'arcotangente di y/x. |
|
cos( x ) |
Restituisce il coseno di x; x è in radianti. |
|
sin( x ) |
Restituisce il seno di x; x è in radianti. |
|
exp( x ) |
Restituisce la funzione esponenziale di x. |
|
log( x ) |
Restituisce il logaritmo di x. |
|
sqrt( x ) |
Restituisce la radice quadrata di x. |
|
int( x ) |
Restituisce il valore di x troncato a un numero intero. |
|
rand( ) |
Restituisce un numero casuale n, con 0 <= n < 1. |
|
srand( [Espr] ) |
Imposta il valore di inizializzazione per la funzione rand sul valore
del parametro Espr o utilizzare l'ora del giorno se il parametro Espr viene omesso. Viene
restituito il precedente valore di inizializzazione. |
Funzioni stringa
Le funzioni stringa sono:
| Funzione |
Operazione |
|
gsub( Ere, Repl, [ In ] ) |
Esegue le stesse operazioni della funzione sub, con l'eccezione che vengono
sostituite tutte le ricorrenze dell'espressione regolare. |
|
sub( Ere, Repl, [ In ] ) |
Sostituisce la prima ricorrenza dell'espressione regolare estesa specificata dal parametro
Ere nella stringa definita dal parametro
In con la stringa definita dal parametro Repl. La funzione sub restituisce il numero di sostituzioni. Un & (ampersand)
visualizzato nella stringa specificata dal parametro
Repl viene sostituito dalla stringa nel parametro
In corrispondente all'espressione regolare estesa specificata
dal parametro Ere.
Se non viene specificato alcun parametro In, il valore predefinito è l'intera registrazione (la variabile di registrazione $0). |
|
index( Stringa1, Stringa2 ) |
Restituisce la posizione, a partire da 1, nella stringa definita dal parametro
Stringa1 in cui si verifica la stringa specificata dal parametro Stringa2. Se il parametro Stringa2 non si verifica nel parametro Stringa1, viene restituito uno 0 (zero). |
|
length [(Stringa)] |
Restituisce la lunghezza, in caratteri, della stringa specificata dal parametro Stringa. Se non viene fornito alcun parametro Stringa, viene restituita la
lunghezza dell'intera registrazione (la variabile di registrazione $0). |
|
blength [(Stringa)] |
Restituisce la lunghezza, in byte, della stringa specificata dal parametro Stringa. Se non viene fornito alcun parametro Stringa, viene restituita la
lunghezza dell'intera registrazione (la variabile di registrazione $0). |
|
substr( Stringa, M, [ N ] ) |
Restituisce una stringa secondaria con il numero di caratteri specificato dal parametro N. La stringa secondaria viene acquisita dalla stringa specificata dal parametro
Stringa, a partire dal carattere nella posizione specificata dal parametro M. Il parametro M viene specificato con il primo carattere nel parametro Stringa come numero 1. Se non si specifica il parametro N, la lunghezza stringa secondaria deriverà dalla posizione specificata dal parametro
M fino alla fine del parametro Stringa . |
|
match( Stringa, Ere ) |
Restituisce la posizione, in caratteri a partire da 1, nella stringa definita dal parametro
Stringa in cui si verifica l'espressione regolare estesa specificata dal parametro
Ere o restituisce 0 (zero) se non si verifica il parametro Ere. La variabile speciale RSTART è impostata sul valore di ritorno. La variabile
speciale RLENGTH è impostata sulla lunghezza della stringa corrisposta o su -1 (uno negativo)
se non viene rilevata alcuna corrispondenza. |
|
split( Stringa, A, [Ere] ) |
Divide la stringa specificata dal parametro Stringa negli elementi della
schiera A[1], A[2],
. . ., A[n] e restituisce il valore
della variabile n. La separazione viene eseguita con l'espressione regolare estesa specificata dal parametro
Ere o con il separatore di campo corrente
(la variabile speciale FS) se il parametro Ere non viene fornito. Gli elementi
nella schiera A vengono creati con valori di stringa, a meno che il contesto non indichi che un
particolare elemento deve avere un valore numerico. |
|
tolower( Stringa ) |
Restituisce la stringa specificata dal parametro Stringa,
con ogni carattere maiuscolo nella stringa modificato in minuscolo. La corrispondenza tra maiuscolo e minuscolo viene
definita dalla categoria LC_CTYPE della locale corrente. |
|
toupper( Stringa ) |
Restituisce la stringa specificata dal parametro Stringa,
con ogni carattere minuscolo nella stringa modificato in maiuscolo. La corrispondenza tra maiuscolo e minuscolo viene
definita dalla categoria LC_CTYPE della locale corrente. |
|
sprintf(Formattazione, Espr, Espr, . . . ) |
Formatta le espressioni specificate dai parametri della routine secondaria Espr secondo la stringa del formato di routine secondaria printf specificata dal parametro
Formattazione e restituisce la stringa risultante. |
Funzioni generali
Le funzioni generali sono:
| Funzione |
Operazione |
|
close( Espressione ) |
Chiudere il file o il pipe aperto da un'istruzione print o printf o da una chiamata alla funzione getline con lo stesso parametro Espressione con il valore della stringa.
Se il file o il pipe viene chiuso correttamente, viene restituito uno 0; altrimenti viene restituito un valore diverso da
zero. L'istruzione close è necessaria se si intende scrivere un file, quindi
leggerlo in un secondo momento nello stesso programma. |
|
system(Comando ) |
Esegue il comando specificato dal parametro Comando e restituisce il relativo stato di uscita. Equivalente alla routine secondaria system. |
|
Espressione | getline [ Variabile ] |
Legge una registrazione di immissione da un flusso convogliato dall'emissione di un comando specificato dal parametro
Espressione e assegna il valore della registrazione alla variabile specificata dal parametro
Variabile. Il flusso viene creato se nessun flusso è correntemente aperto con il valore del parametro
Espressione come relativo nome comando. Il flusso creato è equivalente a quello che si ottiene da una chiamata
alla routine secondaria popen con il parametro Comando che assume il valore del parametro Espressione e il parametro Modalità impostato su un valore di
r. Ogni chiamata successiva alla funzione getline legge un'altra registrazione, finché il flusso rimane aperto e il parametro
Espressione assume il valore della stessa stringa. Se non si specifica il parametro Variabile,
la variabile di registrazione $0 e la variabile speciale NF
vengono impostate sulla registrazione letta dal flusso. |
|
getline [ Variabile ] < Espressione |
Legge la successiva registrazione di immissione dal file denominato dal parametro
Espressione e imposta la variabile specificata dal parametro
Variabile sul valore della registrazione. Ogni chiamata successiva alla funzione getline legge un'altra registrazione, finché il flusso rimane aperto e il parametro
Espressione assume il valore della stessa stringa. Se non si specifica il parametro Variabile,
la variabile di registrazione $0 e la variabile speciale NF
vengono impostate sulla registrazione letta dal flusso. |
|
getline [ Variabile ] |
Imposta la variabile specificata dal parametro Variabile sulla successiva registrazione
di immissione dal file di immissione corrente. Se non si specifica alcun parametro Variabile, la variabile di registrazione $0 è impostata sul valore della registrazione e
vengono impostate anche le variabili speciali NF, NR e FNR. |
Nota:
tutti i formati della funzione getline restituiscono 1 per un'immissione corretta,
zero per la fine del file e -1 per un errore.
Funzioni definite dall'utente
Le funzioni definite dall'utente vengono dichiarate nel seguente formato:
Nome funzione (Parametro, Parametro,...) { Istruzioni }
E' possibile fare riferimento a una funzione in qualsiasi punto di un programma del comando awk e il relativo utilizzo precede la definizione. L'ambito della funzione è globale.
I parametri di funzione possono essere scalari o schiere. I nomi parametri sono locali per la funzione; tutti gli altri nomi variabile sono globali. Sarebbe opportuno non utilizzare lo stesso nome per differenti entità; ad esempio, sarebbe opportuno non duplicare un
nome parametro come nome funzione o variabile speciale. Si consiglia di evitare di assegnare lo stesso nome per una funzione
e per le variabili. Scalari e schiere non devono avere lo stesso nome nello stesso ambito.
Il numero di parametri nella definizione di funzione non deve corrispondere al numero di parametri
utilizzati quando si chiama la funzione. E' possibile utilizzare i parametri formali in eccesso come variabili locali. I parametri
scalari aggiuntivi vengono inizializzati con un valore di stringa equivalente alla stringa vuota e ad un valore numerico 0;
i parametri di schiera aggiuntivi vengono inizializzati come schiere vuote.
Quando si richiama una funzione, non viene inserito alcuno spazio tra il nome funzione e le parentesi
di apertura. Le chiamate di funzione possono essere nidificate e ricorsive.
Come restituzione di qualsiasi chiamata di funzione
ricorsiva o nidificata, i valori di tutti i parametri della funzione chiamante devono essere invariati, ad eccezione dei
parametri della schiera passati come riferimento. E' possibile utilizzare l'istruzione return per restituire un valore.
All'interno di una definizione di funzione, i caratteri di nuova riga sono facoltativi prima della
{ (parentesi graffa) di apertura e dopo la } (parentesi graffa) di chiusura.
Un esempio di definizione di funzione è:
funzione average ( g,n)
{
for (i in g)
sum=sum+g[i]
avg=sum/n
return avg
}
La funzione average viene passata in una schiera g e in una variabile, n, con il numero di elementi nella schiera. La funzione ottiene
quindi la media e la restituisce.
Istruzioni condizionali
La maggior parte delle istruzioni condizionali nel linguaggio di programmazione del comando awk hanno la stessa sintassi e funzione delle istruzioni condizionali nel linguaggio di programmazione C. Tutte le
istruzioni condizionali consentono l'uso delle { } (parentesi graffe) per raggruppare le istruzioni. E' possibile utilizzare
una nuova riga facoltativa tra la parte dell'espressione e la parte dell'istruzione condizionale e le nuove righe o il ;
(punto e virgola) vengono utilizzati per separare più istruzioni nelle
{ } (parentesi graffe). Sei istruzioni condizionali nel linguaggio C sono:
| Istruzione condizionale |
Sintassi richiesta o descrizione |
|
if |
if ( Espressione ) { Istruzione } [ else Azione ] |
|
while |
while ( Espressione ) { Istruzione } |
|
for |
for ( Espressione ; Espressione ; Espressione ) { Istruzione } |
|
break |
Causa l'uscita dal loop del programma quando l'istruzione break viene utilizzata in un'istruzione while o for. |
|
continue |
Causa lo spostamento del loop del programma alla successiva iterazione quando l'istruzione continue viene utilizzata in un'istruzione while o for. |
Cinque istruzioni condizionali nel linguaggio di programmazione del comando awk che non seguono le regole del linguaggio C sono:
| Istruzione condizionale |
Sintassi richiesta o descrizione |
|
for...in |
for ( Variabile in Schiera ) { Istruzione }
L'istruzione for...in imposta il parametro Variabile su ogni valore dell'indice della variabile Schiera, un indice alla volta e in nessun ordine particolare ed esegue
l'azione specificata dal parametro Istruzione con ogni iterazione. Consultare l'istruzione delete
per un esempio di un'istruzione for...in. |
|
if...in |
if ( Variabile in Schiera ) { Istruzione }
L'istruzione if...in ricerca l'esistenza dell'elemento
Schiera. L'istruzione viene eseguita se viene rilevato l'elemento Schiera. |
|
delete |
delete Schiera [ Espressione ]
L'istruzione delete elimina sia l'elemento di schiera specificato dal parametro
Schiera che l'indice specificato dal parametro
Espressione. Ad esempio, le istruzioni:
for (i in g)
delete g[i];
eliminano ogni elemento della schiera
g[]. |
|
exit |
exit [ Espressione ]
L'istruzione exit richiama subito tutte le azioni END nell'ordine in cui si verificano, quindi
termina il comando awk con uno stato di uscita specificato dal parametro
Espressione. Non viene richiamata alcuna azione END successiva se l'istruzione exit si verifica all'interno di un'azione END. |
|
# |
# Commento
L'istruzione # inserisce i commenti. I commenti devono terminare sempre
con una nuova riga, ma possono iniziare in qualsiasi punto di una riga. |
|
next |
Arresta l'elaborazione della registrazione di immissione corrente e procede con la successiva registrazione di
immissione. |
Istruzioni di emissione
Le due istruzioni di emissione nel linguaggio di programmazione del comando awk
sono:
| Istruzioni di emissione |
Sintassi e descrizione |
|
print |
print [ Elenco di espressioni ] [ Reindirizzamento ]
[ Espressione ]
L'istruzione print scrive il valore di ogni espressione specificato dal parametro Elenco di espressioni nell'emissione standard. Ogni espressione è separata dal valore corrente della
variabile speciale OFS e ogni registrazione viene terminata dal valore corrente della variabile
speciale ORS.
E' possibile reindirizzare l'emissione utilizzando il parametro
Reindirizzamento, che consente di specificare tre reindirizzamenti di emissione con il
simbolo > (maggiore di), >> (doppio maggiore di) e | (pipe). Il parametro Reindirizzamento
specifica la modalità di reindirizzamento dell'emissione e il parametro Espressione è un nome percorso a un file (quando il parametro Reindirizzamento è > o >> ) o il nome di un comando (quando il parametro Reindirizzamento è un | ). |
|
printf |
printf Formattazione [ , Elenco di espressioni ] [ Reindirizzamento ] [ Espressione ]
L'istruzione printf scrive nell'emissione standard le espressioni specificate dal parametro
Elenco di espressioni nel formato specificato dal parametro
Formattazione. L'istruzione printf ha la stessa funzionalità del comando
printf, con l'eccezione della specifica di conversione c (%c). I parametri Reindirizzamento e Espressione hanno la stessa funzionalità dell'istruzione print.
Per la specifica della conversione c: se l'argomento ha un valore numerico, il carattere la cui codifica è tale valore sarà l'emissione.
Se il valore è zero
o non è la codifica di alcun carattere nella serie di caratteri, la funzionalità non è definita. Se l'argomento non ha un
valore numerico, il primo carattere del valore della stringa sarà l'emissione; se la stringa non contiene alcun carattere,
la funzionalità non è definita. |
Nota:
se il parametro Espressione specifica
un nome percorso per il parametro Reindirizzamento, occorre racchiudere il parametro Espressione tra doppi apici per assicurarsi che venga considerato come
stringa.
Variabili
Le variabili possono essere scalari, variabili di campo, schiere o variabili speciali.
I nomi
di variabile non possono iniziare con una cifra.
E' possibile utilizzare le variabili semplicemente facendo riferimento ad esse. Ad eccezione dei
parametri di funzione, non vengono dichiarate esplicitamente. Le variabili scalari non inizializzate e gli elementi di schiera
hanno sia un valore numerico 0 (zero) che un valore di stringa della stringa nulla (" ").
Le variabili assumono valori di stringa o numerici a seconda del contesto. Ogni variabile può avere
un valore numerico, un valore di stringa o entrambi. Ad esempio:
x = "4" + "8"
assegna il valore di 12 alla variabile
x. Per costanti di stringa, occorre racchiudere le espressioni
tra " " (doppi apici).
Non esistono conversioni esplicite tra numeri e stringhe. Per fare in modo che un'espressione
venga considerata come numero, aggiungere 0 (zero). Per fare in modo che un'espressione
venga considerata come stringa, aggiungere una stringa nulla (" ").
Variabili di campo
Le variabili di campo sono indicate da un $ (simbolo del dollaro) seguito da un numero o da un'espressione numerica. Al primo campo in una registrazione viene
assegnata la variabile $1, al secondo campo viene assegnata la variabile
$2 e via di seguito. La variabile di campo $0 viene assegnata all'intera
registrazione. E' possibile creare nuove variabili di campo, assegnando loro un valore. L'assegnazione di un valore a
un campo inesistente, ossia, a qualsiasi campo con dimensioni superiori al valore corrente della variabile di campo
$NF, forza la creazione dei campi coinvolti (impostati sulla stringa nulla), incrementa il
valore della variabile speciale NF e forza un nuovo calcolo del valore della variabile di registrazione $0. I nuovi campi sono separati dal separatore di campo corrente (che è il valore della variabile speciale
FS). Gli spazi e le tabulazioni sono i separatori di campo predefiniti. Per modificare il separatore di campo, utilizzare l'indicatore -F o
assegnare alla variabile speciale FS un valore differente nel programma del comando awk.
Schiere
Le schiere sono inizialmente vuote e la relativa dimensione cambia dinamicamente.
Le schiere sono rappresentate da una variabile con indici in [ ] (parentesi quadre).
Gli indici o gli identificativi di elemento possono essere numeri di stringhe, che forniscono un tipo di capacità di
schiera associativa. Ad esempio, il programma:
/red/ { x["red"]++ }
/green/ { y["green"]++ }
incrementa i conteggi sia per il contatore red che per il contatore green.
E' possibile indicizzare le schiere con più indici, in modo simile alle schiere multidimensionali
in alcuni linguaggi di programmazione. Dal momento che le schiere di programmazione per il comando
awk sono unidimensionali, gli indici separati da virgole vengono convertiti in una singola stringa
concatenando i valori di stringa delle espressioni separate, con ogni espressione separata dal valore della variabile
di ambiente SUBSEP. Quindi, le due operazioni di indice seguenti sono equivalenti:
x[expr1, expr2,...exprn]
E
x[expr1SUBSEPexpr2SUBSEP...SUBSEPexprn]
Quando si utilizza l'operatore in, sarebbe opportuno inserire
il valore Indice multidimensionale tra
parentesi. Ad eccezione dell'operatore in, qualsiasi riferimento a un elemento di schiera inesistente
crea automaticamente tale elemento.
Variabili speciali
Le seguenti variabili hanno un significato speciale per il comando awk:
| Variabile speciale |
Descrizione |
|
ARGC |
Il numero di elementi nella schiera ARGV. Tale valore può essere
modificato. |
|
ARGV |
La schiera con ogni membro contenente una delle variabili File o Assegnazione, prese nell'ordine dalla riga comandi e numerate da 0 (zero)
a ARGC -1. Non appena termina ogni file di immissione, il membro successivo della schiera ARGV fornisce il nome del successivo file di immissione, a meno che:
-
Il successivo membro non sia un'istruzione Assegnazione, nel cui caso viene
calcolata l'assegnazione.
-
Il successivo membro non abbia un valore nullo, nel cui caso il membro viene ignorato. I programmi
possono ignorare file di immissione impostando il membro della schiera
ARGV che contiene tale file di immissione su un valore nullo.
-
Il membro successivo è il valore corrente di ARGV [ARGC -1], che il comando awk interpreta come la fine dei file di immissione.
|
|
CONVFMT |
Il formato printf per la conversione di numeri in stringhe (eccetto per le istruzioni di
emissione, in cui si utilizza la variabile speciale OFMT). Il valore predefinito è "%.6g". |
|
ENVIRON |
Una schiera che rappresenta l'ambiente in cui opera il comando awk. Ogni elemento della schiera ha il formato:
ENVIRON [ "Nome variabile ambiente" ] = Valore variabile ambiente
I valori vengono impostati quando il comando awk inizia l'esecuzione e tale ambiente
viene utilizzato fino alla fine dell'esecuzione, indipendentemente da eventuali modifiche alla variabile speciale
ENVIRON. |
|
FILENAME |
Il nome percorso del file di immissione corrente. Durante l'esecuzione di un'azione
BEGIN, il valore di FILENAME è indefinito. Durante l'esecuzione di un'azione END, il valore è il nome dell'ultimo file di
immissione elaborato. |
|
FNR |
Il numero della registrazione di immissione attuale nel file corrente. |
|
FS |
Il separatore del campo di immissione. Il valore predefinito è uno spazio. Se il separatore di campo è uno spazio,
qualsiasi numero di spazi definiti dalla locale può separare i campi. La variabile speciale FS
può assumere due ulteriori valori:
-
Con FS impostato su un singolo carattere, i campi sono separati da ogni singola
ricorrenza del carattere.
-
Con FS impostato su un'espressione
regolare estesa, ogni ricorrenza di una sequenza che corrisponde ai campi separati dell'espressione regolare
estesa.
|
|
NF |
Il numero di campi nella registrazione corrente, con un limite di 99. All'interno di un'azione
BEGIN, la variabile speciale NF è indefinita a meno che la funzione
getline senza il parametro
Variabile non sia stata immessa precedentemente. All'interno di un'azione
END, la variabile speciale NF mantiene il valore che aveva per l'ultima
registrazione letta, a meno che non venga immessa una funzione
getline successiva e reindirizzata senza un parametro Variabile prima di immettere un'azione END. |
|
NR |
Il numero della registrazione di immissione corrente. All'interno di un'azione BEGIN, il valore della variabile speciale NR è
0 (zero). All'interno di un'azione END, il valore è il numero dell'ultima registrazione
elaborata. |
|
OFMT |
Il formato printf per la conversione di numeri in stringhe nelle istruzioni di
emissione. Il valore predefinito è "%.6g". |
|
OFS |
Il separatore del campo di emissione (il valore predefinito è uno spazio). |
|
ORS |
Il separatore della registrazione di emissione (il valore predefinito è un carattere di nuova riga). |
|
RLENGTH |
La lunghezza della stringa corrisposta dalla funzione match. |
|
RS |
Il separatore della registrazione di immissione (il valore predefinito è un carattere di nuova riga). Se la variabile speciale RS è nulla, le registrazioni sono separate da sequenze di una o più righe vuote; le righe iniziali o
finali non danno come risultato registrazioni vuote all'inizio o alla fine di un'immissione e il carattere di nuova riga
è sempre un separatore di campo, indipendentemente dal valore della variabile speciale
FS. |
|
RSTART |
La posizione iniziale della stringa corrisposta dalla funzione match, a partire da 1. Equivalente al valore di restituzione della funzione match. |
|
SUBSEP |
Separa più indici. Il valore predefinito è \031. |
Indicatori
|
-f File di programma |
Acquisisce istruzioni per il comando awk dal file specificato dalla variabile
File di programma. Se si specifica più volte l'indicatore
-f, la concatenazione di file nell'ordine specificato verrà utilizzata come serie di
istruzioni. |
|
-F Ere |
Utilizza l'espressione regolare estesa specificata dalla variabile Ere come separatore di campo. Il separatore di campo predefinito è uno spazio. |
|
-v Assegnazione |
Assegna un valore a una variabile per il linguaggio di programmazione del comando awk. Il parametro Assegnazione
ha il formato Nome = Valore. La parte Nome specifica il nome della variabile e può essere qualsiasi combinazione di sottolineature, cifre e caratteri
alfabetici, ma deve iniziare con un carattere alfabetico o con una sottolineatura. Anche la parte Valore è composta da sottolineature, cifre e caratteri alfabetici e viene trattata come se fosse preceduta e seguita da un
" (carattere di doppio apice, simile a un valore stringa). Se la parte Valore è numerica, anche alla
variabile verrà assegnato il valore numerico.
L'assegnazione specificata dall'indicatore -v si verifica prima dell'esecuzione di qualsiasi parte
del programma del comando awk, inclusa la sezione
BEGIN. |
|
Assegnazione |
Assegna un valore a una variabile per il linguaggio di programmazione del comando awk. Ha lo stesso formato e funzione della variabile Assegnazione con l'indicatore -v, eccetto per la durata dell'elaborazione di ognuna. Il parametro Assegnazione
viene elaborato esattamente prima del file di immissione (specificato dalla variabile File) che lo segue sulla riga comandi. Se si specifica il parametro Assegnazione esattamente prima del primo di più file di immissione, le assegnazioni vengono elaborate dopo le
sezioni BEGIN (se presenti). Se si verifica un parametro Assegnazione
dopo l'ultimo file, l'assegnazione viene elaborata prima delle sezioni END (se presenti). Se non si specifica alcun file di immissione, le assegnazioni vengono elaborate e l'immissione
standard viene letta. |
|
File |
Specifica il nome del file che contiene l'immissione per l'elaborazione.
Se non si specifica alcuna variabile File o si specifica un segno - (meno), l'immissione standard viene elaborata. |
|
'Programma' |
Contiene le istruzioni per il comando awk.
Se non si specifica l'indicatore -f, la variabile Programma deve essere il primo elemento sulla riga comandi. Inserire tale elemento tra
' ' (apici singoli). |
Stato di uscita
Questo comando restituisce i seguenti valori di uscita:
|
0 |
Completamento riuscito. |
|
>0 |
Si è verificato un errore. |
Esempi
- Per visualizzare le righe di un file con lunghezza superiore a 72 caratteri, immettere:
awk 'length >72' chapter1
In questo modo viene selezionata ogni riga del file
chapter1 con lunghezza superiore a 72 caratteri e le righe standard vengono scritte
nell'emissione standard, poiché non si specifica alcuna Azione. Un carattere di tabulazione viene contato come 1 byte.
- Per visualizzare tutte le righe tra le parole start e stop, compresi "start" e "stop", immettere:
awk '/start/,/stop/' chapter1
- Per eseguire un programma del comando awk, sum2.awk, che elabora il file, chapter1,
immettere:
awk -f sum2.awk chapter1
Il seguente programma
sum2.awk, calcola la somma e la media dei numeri nella seconda colonna del file di
immissione, chapter1:
{
sum += $2
}
END {
print "Sum: ", sum;
print "Average:", sum/NR;
} La prima azione aggiunge il valore del secondo campo di ogni riga alla variabile
sum. Tutte le variabili vengono inizializzate sul valore numerico di 0 (zero)
quando si fa riferimento ad esse per la prima volta. Il modello END prima della seconda azione causa l'esecuzione di tali azioni dopo la lettura dell'intero file di
immissione. La variabile speciale NR, utilizzata per calcolare la media, specifica
il numero di registrazioni lette.
- Per stampare i primi due campi nell'ordine opposto,
immettere:
awk '{ print $2, $1 }' chapter1
- Il seguente programma awk
awk -f sum3.awk chapter2
stampa i primi due campi del file chapter2 con i campi di immissione separati da virgole e/o spazi e caratteri di tabulazione e quindi aggiunge la prima
colonna e stampa la somma e la media:
BEGIN {FS = ",|[ \t]+"}
{print $1, $2}
{s += $1}
END {print "sum is",s,"average is", s/NR }
Informazioni correlate
Il comando grep e il comando sed.