Successivo: ARGC e ARGV, Precedente: Variabili modificabili dall'utente, Su: Variabili predefinite [Contenuti][Indice]
awk
fornisce informazioniQuella 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 vettoreFUNCTAB
genera un errore fatale. Genera un errore fatale anche ogni tentativo di impostare un elemento diFUNCTAB
.
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, 40 né
FUNCTAB
néSYMTAB
sono disponibili come elemento all’interno del vettoreSYMTAB
.
Modificare
NR e FNR
$ echo '1 > 2 > 3 > 4' | awk 'NR == 2 { NR = 17 } > { print NR }' -| 1 -| 17 -| 18 -| 19 Prima che |
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.
Per non parlare dei grossi problemi di implementazione.
Successivo: ARGC e ARGV, Precedente: Variabili modificabili dall'utente, Su: Variabili predefinite [Contenuti][Indice]