Successivo: , Precedente: , Su: Variabili predefinite   [Contenuti][Indice]


7.5.2 Variabili predefinite con cui awk fornisce informazioni

Quella che segue è una lista in ordine alfabetico di variabili che awk imposta automaticamente in determinate situazioni per fornire informazioni a un programma.

Le variabili specifiche di gawk sono contrassegnate da un cancelletto (‘#’). Queste variabili sono estensioni gawk. In altre implementazioni di awk o se gawk è in modalità compatibile (vedi Opzioni), non hanno un significato speciale:

ARGC, ARGV

Gli argomenti della riga di comando disponibili ai programmi awk sono memorizzati in un vettore di nome ARGV. ARGC è il numero di argomenti presenti sulla riga di comando. Vedi Altri argomenti. A differenza di quasi tutti i vettori di awk, ARGV è indicizzato da 0 a ARGC - 1. Lo si può vedere nell’esempio seguente:

$ awk 'BEGIN {
>         for (i = 0; i < ARGC; i++)
>             print ARGV[i]
>      }' inventory-shipped mail-list
-| awk
-| inventory-shipped
-| mail-list

ARGV[0] contiene ‘awk’, ARGV[1] contiene ‘inventory-shipped’ e ARGV[2] contiene ‘mail-list’. Il valore di ARGC è tre, ossia uno in più dell’indice dell’ultimo elemento di ARGV, perché gli elementi sono numerati a partire da zero.

I nomi ARGC e ARGV, come pure la convenzione di indicizzare il vettore da 0 a ARGC - 1, derivano dal modo in cui il linguaggio C accede agli argomenti presenti sulla riga di comando.

Il valore di ARGV[0] può variare da sistema a sistema. Va anche notato che il programma non è incluso in ARGV, e non sono incluse neppure le eventuali opzioni di awk specificate sulla riga di comando. Vedi ARGC e ARGV per informazioni su come awk usa queste variabili. (a.b.)

ARGIND #

L’indice in ARGV del file correntemente in elaborazione. Ogni volta che gawk apre un nuovo file-dati per elaborarlo, imposta ARGIND all’indice in ARGV del nome-file. Quando gawk sta elaborando i file in input, il confronto ‘FILENAME == ARGV[ARGIND]’ è sempre verificato.

Questa variabile è utile nell’elaborazione dei file; consente di stabilire a che punto ci si trova nella lista di file-dati, e anche di distinguere tra successive occorrenze dello stesso nome-file sulla riga dei comandi.

Anche se è possibile modificare il valore di ARGIND all’interno del programma awk, gawk automaticamente lo imposta a un nuovo valore quando viene aperto il file successivo.

ENVIRON

Un vettore associativo contenente i valori delle variabili d’ambiente. Gli indici del vettore sono i nomi delle variabili d’ambiente; gli elementi sono i valori della specifica variabile d’ambiente. Per esempio, ENVIRON["HOME"] potrebbe valere /home/arnold.

Per POSIX awk, le modifiche a questo vettore non cambiano le variabili d’ambiente passate a qualsivoglia programma che awk può richiamare tramite una ridirezione o usando la funzione system().

Tuttavia, a partire dalla versione 4.2, se non si è in modalità compatibile POSIX, gawk aggiorna le proprie variabili d’ambiente, quando si modifica ENVIRON, e in questo modo sono modificate anche le variabili d’ambiente disponibili ai programmi richiamati. Un’attenzione speciale dovrebbe essere prestata alla modifica di ENVIRON["PATH"], che è il percorso di ricerca usato per trovare i programmi eseguibili.

Queste modifiche possono anche influire sul programma gawk, poiché alcune funzioni predefinite possono tener conto di certe variabili d’ambiente. L’esempio più notevole di una tale situazione è mktime() (vedi Funzioni di tempo) che, in molti sistemi, tiene conto del valore della variabile d’ambiente TZ.

Alcuni sistemi operativi possono non avere variabili d’ambiente. In tali sistemi, il vettore ENVIRON è vuoto (tranne che per le variabili ENVIRON["AWKPATH"] e ENVIRON["AWKLIBPATH"] eventualmente presenti; vedi AWKPATH (Variabile) e vedi AWKLIBPATH (Variabile)).

ERRNO #

Se si verifica un errore di sistema durante una ridirezione per getline, durante una lettura per getline o durante un’operazione di close(), la variabile ERRNO contiene una stringa che descrive l’errore.

Inoltre, gawk annulla ERRNO prima di aprire ogni file in input presente sulla riga di comando. Questo consente di controllare se il file è accessibile all’interno di un criterio di ricerca BEGINFILE (vedi BEGINFILE/ENDFILE).

Per il resto, ERRNO si comporta analogamente alla variabile C errno. Tranne nel caso sopra accennato, gawk non annulla mai ERRNO (lo imposta a zero o a ""). Quindi, ci si deve aspettare che il suo valore sia significativo solo quando un’operazione di I/O restituisce un valore che indica il fallimento dell’operazione, come per esempio quando getline restituisce -1. Si è, naturalmente, liberi di annullarla prima di effettuare un’operazione di I/O.

Se il valore di ERRNO corrisponde a un errore di sistema della variabile C errno, PROCINFO["errno"] sarà impostato al valore di errno. Per errori non di sistema, PROCINFO["errno"] sarà impostata al valore zero.

FILENAME

Il nome del file in input corrente. Quando non ci sono file-dati sulla riga dei comandi, awk legge dallo standard input e FILENAME è impostato a "-". FILENAME cambia ogni volta che si legge un nuovo file (vedi Leggere file). All’interno di una regola BEGIN, il valore di FILENAME è "", perché non si sta elaborando alcun file in input.39 (a.b.) Si noti, tuttavia, che l’uso di getline (vedi Getline) all’interno di una regola BEGIN può implicare l’assegnamento di un valore a FILENAME.

FNR

Il numero del record corrente nel file corrente. awk incrementa FNR ogni volta che legge un nuovo record (vedi Record). awk imposta nuovamente a zero FNR ogni volta che inizia a leggere un nuovo file in input.

NF

Il numero di campi nel corrente record in input. NF è impostato ogni volta che si legge un nuovo record, quando un nuovo campo viene creato, o quando si modifica $0 (vedi Campi).

A differenza di molte altre variabili descritte in questa sottosezione, l’assegnamento di un valore a NF può potenzialmente influenzare il funzionamento interno di awk. In particolare, assegnamenti a NF si possono usare per aggiungere o togliere campi dal record corrente. Vedi Cambiare i campi.

FUNCTAB #

Un vettore i cui indici e i corrispondenti valori sono i nomi di tutte le funzioni predefinite, definite dall’utente ed estese, presenti nel programma.

NOTA: Il tentativo di usare l’istruzione delete per eliminare il vettore FUNCTAB genera un errore fatale. Genera un errore fatale anche ogni tentativo di impostare un elemento di FUNCTAB.

NR

Il numero di record in input che awk ha elaborato dall’inizio dell’esecuzione del programma (vedi Record). awk incrementa NR ogni volta che legge un nuovo record.

PROCINFO #

Gli elementi di questo vettore danno accesso a informazioni sul programma awk in esecuzione. I seguenti elementi (elencati in ordine alfabetico) sono sicuramente sempre disponibili:

PROCINFO["egid"]

Il valore restituito dalla chiamata di sistema getegid().

PROCINFO["errno"]

Il valore della variabile C ERRNO quando ERRNO è impostato al messaggio di errore a essa associato.

PROCINFO["euid"]

Il valore restituito dalla chiamata di sistema geteuid().

PROCINFO["FS"]

Questo elemento vale "FS" se è in uso la separazione in campi con FS, "FIELDWIDTHS" se è in uso quella con FIELDWIDTHS, oppure "FPAT" se è in uso l’individuazione di campo con FPAT.

PROCINFO["gid"]

Il valore restituito dalla chiamata di sistema getgid() .

PROCINFO["identifiers"]

Un sottovettore, indicizzato dai nomi di tutti gli identificativi usati all’interno del programma awk. Un identificativo è semplicemente il nome di una variabile (scalare o vettoriale), una funzione predefinita, una funzione definita dall’utente, o una funzione contenuta in un’estensione. Per ogni identificativo, il valore dell’elemento è uno dei seguenti:

"array"

L’identificativo è un vettore.

"builtin"

L’identificativo è una funzione predefinita.

"extension"

L’identificativo è una funzione in un’estensione caricata tramite @load o con l’opzione -l.

"scalar"

L’identificativo è uno scalare.

"untyped"

L’identificativo non ha ancora un tipo (potrebbe essere usato come scalare o come vettore; gawk non è ancora in grado di dirlo).

"user"

L’identificativo è una funzione definita dall’utente.

I valori riportano ciò che gawk sa sugli identificativi dopo aver finito l’analisi iniziale del programma; questi valori non vengono più aggiornati durante l’esecuzione del programma.

PROCINFO["pgrpid"]

Il ID di gruppo del processo del programma corrente.

PROCINFO["pid"]

Il process ID del programma corrente.

PROCINFO["ppid"]

Il ID di processo del padre del programma corrente.

PROCINFO["strftime"]

La stringa col formato di default usato per la funzione strftime(). Assegnando un nuovo valore a questo elemento si cambia quello di default. Vedi Funzioni di tempo.

PROCINFO["uid"]

Il valore restituito dalla chiamata di sistema getuid().

PROCINFO["version"]

La versione di gawk.

I seguenti elementi addizionali del vettore sono disponibili per fornire informazioni sulle librerie MPFR e GMP, se la versione in uso di gawk consente il calcolo con precisione arbitraria (vedi Calcolo con precisione arbitraria):

PROCINFO["gmp_version"]

La versione della libreria GNU MP.

PROCINFO["mpfr_version"]

La versione della libreria GNU MPFR.

PROCINFO["prec_max"]

La massima precisione consentita da MPFR.

PROCINFO["prec_min"]

La precisione minima richiesta da MPFR.

I seguenti elementi addizionali del vettore sono disponibili per fornire informazioni sulla versione dell’estensione API, se la versione di gawk prevede il caricamento dinamico di funzioni di estensione (vedi Estensioni dinamiche):

PROCINFO["api_major"]

La versione principale dell’estensione API.

PROCINFO["api_minor"]

La versione secondaria dell’estensione API.

Su alcuni sistemi, ci possono essere elementi nel vettore, da "group1" fino a "groupN". N è il numero di gruppi supplementari che il processo [Unix] possiede. Si usi l’operatore in per verificare la presenza di questi elementi (vedi Visitare elementi).

I seguenti elementi consentono di modificare il comportamento di gawk:

PROCINFO["NONFATAL"]

Se questo elemento esiste, gli errori di I/O per tutte le ridirezioni consentono la prosecuzizone del programma. Vedi Continuazione dopo errori.

PROCINFO["nome_output", "NONFATAL"]

Gli errori in output per il file nome_output consentono la prosecuzizone del programma. Vedi Continuazione dopo errori.

PROCINFO["comando", "pty"]

Per una comunicazione bidirezionale con comando, si usi una pseudo-tty invece di impostare una pipe bidirezionale. Vedi I/O bidirezionale per ulteriori informazioni.

PROCINFO["input_name", "READ_TIMEOUT"]

Imposta un tempo limite per leggere dalla ridirezione di input input_name. Vedi Timeout in lettura per ulteriori informazioni.

PROCINFO["sorted_in"]

Se questo elemento esiste in PROCINFO, il suo valore controlla l’ordine in cui gli indici dei vettori saranno elaborati nei cicli ‘for (indice in vettore)’. Questa è una funzionalità avanzata, la cui descrizione completa sarà vista più avanti; si veda Visitare un intero vettore.

RLENGTH

La lunghezza della sottostringa individuata dalla funzione match() (vedi Funzioni per stringhe). RLENGTH viene impostata quando si richiama la funzione match(). Il suo valore è la lunghezza della stringa individuata, oppure -1 se non è stata trovata alcuna corrispondenza.

RSTART

L’indice, in caratteri, da cui parte la sottostringa che è individuata dalla funzione match() (vedi Funzioni per stringhe). RSTART viene impostata quando si richiama la funzione match(). Il suo valore è la posizione nella stringa da cui inizia la sottostringa individuata, oppure zero, se non è stata trovata alcuna corrispondenza.

RT #

Il testo in input che corrisponde al testo individuato da RS, il separatore di record. Questa variabile viene impostata dopo aver letto ciascun record.

SYMTAB #

Un vettore i cui indici sono i nomi di tutte le variabili globali e i vettori definiti nel programma. SYMTAB rende visibile al programmatore awk la tabella dei simboli di gawk. Viene preparata nella fase di analisi iniziale del programma gawk ed è completata prima di cominciare a eseguire il programma.

Il vettore può essere usato per accedere indirettamente, in lettura o in scrittura, al valore di una variabile:

pippo = 5
SYMTAB["pippo"] = 4
print pippo    # stampa 4

La funzione isarray() (vedi Funzioni per i tipi) si può usare per controllare se un elemento in SYMTAB è un vettore. Inoltre, non è possibile usare l’istruzione delete con il vettore SYMTAB.

È possibile aggiungere a SYMTAB un elemento che non sia un identificativo già esistente:

SYMTAB["xxx"] = 5
print SYMTAB["xxx"]

Il risultato è quello previsto: in questo caso SYMTAB si comporta come un normale vettore. La sola differenza è che non è poi possibile cancellare SYMTAB["xxx"].

Il vettore SYMTAB è più interessante di quel che sembra. Andrew Schorr fa notare che effettivamente consente di ottenere dei puntatori ai dati in awk. Si consideri quest’esempio:

# Moltiplicazione indiretta di una qualsiasi variabile per un
# numero a piacere e restituzione del risultato

function multiply(variabile, numero)
{
    return SYMTAB[variabile] *= numero
}

Si potrebbe usare in questo modo:

BEGIN {
    risposta = 10.5
    multiply("risposta", 4)
    print "La risposta è", risposta
}

Eseguendo, il risultato è:

$ gawk -f risposta.awk
-| La risposta è 42

NOTA: Per evitare seri paradossi temporali, 40FUNCTABSYMTAB sono disponibili come elementi all’interno del vettore SYMTAB.

Modificare NR e FNR

awk incrementa le variabili NR e FNR ogni volta che legge un record, invece che impostarle al valore assoluto del numero di record letti. Ciò significa che un programma può modificare queste variabili e i valori così assegnati sono incrementati per ogni record. (a.b.) Si consideri l’esempio seguente:

$ echo '1
> 2
> 3
> 4' | awk 'NR == 2 { NR = 17 }
> { print NR }'
-| 1
-| 17
-| 18
-| 19

Prima che FNR venisse aggiunto al linguaggio awk (vedi V7/SVR3.1), molti programmi awk usavano questa modalità per contare il numero di record in un file impostando a zero NR al cambiare di FILENAME.


Note a piè di pagina

(39)

Alcune tra le prime implementazioni di Unix awk inizializzavano FILENAME a "-", anche se vi erano file-dati da elaborare. Un tale comportamento era incorretto e non ci si dovrebbe poter contare nei programmi.

(40)

Per non parlare dei grossi problemi di implementazione.


Successivo: , Precedente: , Su: Variabili predefinite   [Contenuti][Indice]