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:

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:

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:

  1. 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.

  2. 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.

  3. 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.

  4. Se la registrazione corrisponde a un modello, qualsiasi azione associata a tale modello viene eseguita sulla registrazione.
  5. 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.
  6. 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.
  7. 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:

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

  1. 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.

  2. Per visualizzare tutte le righe tra le parole start e stop, compresi "start" e "stop", immettere:

    awk  '/start/,/stop/'  chapter1
  3. 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.

  4. Per stampare i primi due campi nell'ordine opposto, immettere:

    awk '{ print $2, $1 }' chapter1
  5. 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.


Invia feedback |  Valuta questa pagina