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 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 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 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
:
Se questo elemento esiste, gli errori di I/O per tutte le ridirezioni consentono la prosecuzizone del programma. Vedi Continuazione dopo errori.
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, 40 né
FUNCTAB
néSYMTAB
sono disponibili come elementi 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]