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 la sezione Opzioni sulla riga di comando), 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 la sezione Altri argomenti della riga di comando. 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 la sezione Usare 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 la sezione Funzioni per gestire marcature temporali) 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 la sezione Ricerca di programmi awk in una lista di directory. e vedi la sezione Ricerca di librerie condivise awk su varie directory.).

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 la sezione I criteri di ricerca speciali BEGINFILE ed 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 la sezione Leggere file in input). 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 la sezione Richiedere input usando 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 la sezione Controllare come i dati sono suddivisi in 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 la sezione Un’introduzione ai 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 la sezione Cambiare il contenuto di un campo.

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 la sezione Controllare come i dati sono suddivisi in 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["argv"]

Il vettore PROCINFO["argv"] contiene tutti gli argomenti della riga di comando (dopo che l’eventuale elaborazione di valutazione e ridirezione, nelle piattaforme in cui ciò debba essere fatto a cura del programma), con indici che vanno da 0 a argc - 1. Per esempio, PROCINFO["argv"][0] conterrà il nome con cui gawk è stato richiamato. Ecco un esempio di come si può usare questa funzionalità:

gawk '
BEGIN {
        for (i = 0; i < length(PROCINFO["argv"]); i++)
                print i, PROCINFO["argv"][i]
}'

Si tenga presente che questo vettore è diverso dal vettore standard ARGV il quale non include quegli argomenti della riga di comando che sono già stati elaborati da gawk (vedi la sezione Usare ARGC e ARGV).

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, "FPAT" se è in uso l’individuazione di campo con FPAT, o "API" se la divisione in campi è controllata da un analizzatore di input tramite API.

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["platform"]

Quest’elemento restituisce una stringa che indica la piattaforma per la quale gawk è stato compilato. Il valore sarà uno dei seguenti:

"djgpp"
"mingw"

Microsoft Windows, utilizzando DJGPP o MinGW, rispettivamente.

"os2"

OS/2.

"os390"

OS/390.

"posix"

GNU/Linux, Cygwin, Mac OS X, e sistemi Unix tradizionali.

"vms"

OpenVMS o Vax/VMS.

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 la sezione Funzioni per gestire marcature temporali.

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 la sezione Calcolo con precisione arbitraria con gawk):

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 la sezione Scrivere estensioni per gawk):

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 la sezione Come esaminare un elemento di un vettore).

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 prosecuzione del programma. Vedi la sezione Abilitare continuazione dopo errori in output.

PROCINFO["nome", "NONFATAL"]

Gli errori di I/O per il file nome consentono la prosecuzione del programma. Vedi la sezione Abilitare continuazione dopo errori in output.

PROCINFO["comando", "pty"]

Per una comunicazione bidirezionale con comando, si usi una pseudo-tty invece di impostare una pipe bidirezionale. Vedi la sezione Comunicazioni bidirezionali con un altro processo per ulteriori informazioni.

PROCINFO["input_name", "READ_TIMEOUT"]

Imposta un tempo limite per leggere dalla ridirezione di input input_name. Vedi la sezione Leggere input entro un tempo limite per ulteriori informazioni.

PROCINFO["input_name", "RETRY"]

Se durante la lettura del file input_name si verifica un errore di I/O per il quale si può ritentare una lettura, e questo elemento di vettore esiste, getline dà come codice di ritorno -2 invece di seguire il comportamento di default, che consiste nel restituire -1 e configurare input_name in modo che non fornisca più alcun dato. Un errore di I/O per cui si può ritentare una lettura in cui errno ha il valore EAGAIN, EWOULDBLOCK, EINTR, o ETIMEDOUT. Ciò può essere utile in associazione con l’elemento di vettore PROCINFO["input_name", "READ_TIMEOUT"] o in situazioni in cui un descrittore di file è stato configurato per comportarsi in modo da non bloccare l’elaborazione. Vedi la sezione Elaborare ulteriore input dopo certi errori di I/O 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 Visita di vettori in ordine predefinito con gawk.

RLENGTH

La lunghezza della sottostringa individuata dalla funzione match() (vedi la sezione Funzioni di manipolazione di 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 la sezione Funzioni di manipolazione di 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 la sezione Funzioni per conoscere il tipo di una variabile) si può usare per controllare se un elemento in SYMTAB è un vettore. Inoltre, non è possibile usare l’istruzione delete con il vettore SYMTAB.

Prima della versione 5.0 di gawk, era possibile usare come indice per SYMTAB una stringa che non era un identificativo già esistente:

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

Ciò non è più possibile, e il farlo determina un errore fatale, perché il poterlo fare era solo fonte di confusione.

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 elemento 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 la sezione Differenze importanti tra V7 e System V Release 3.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]