GAWK(1) Comandi di utilit GAWK(1)
gawk - linguaggio di ricerca ed elaborazione di configurazioni di testo
(o "pattern", come diremo d'ora in poi).
gawk [ opzioni in stile POSIX o GNU ] -f file-di-programma [ -- ] file
...
gawk [ opzioni in stile POSIX o GNU ] [ -- ] testo-del-programma file
...
Gawk
la realizzazione dell'interprete del linguaggio AWK dello GNU Project.
conforme alla definizione del linguaggio prevista dallo standard
"POSIX 1003.2 Command Language And Utilities". In particolare, questa
versione basata sulla descrizione contenuta in The AWK Programming
Language, di Aho, Kernighan e Weinberger, con le prestazioni aggiuntive
che si trovano nella versione di awk di UNIX System V Release 4. Gawk
mette a disposizione inoltre le estensioni del pi recente awk dei Bell
Labs ed alcune funzionalit specifiche di GNU.
La linea di comando consiste in opzioni di gawk stesso, il testo del
programma AWK (a meno che non sia contenuto in un file indicato con
l'opzione -f o --file), e valori che saranno resi disponibili al pro-
gramma nelle variabili predefinite ARGC e ARGV.
Le opzioni di Gawk possono essere sia nella tradizionale forma a una
lettera di POSIX, sia nella forma estesa tipica di GNU. Le opzioni
POSIX cominciano con un "-" singolo, quelle in forma lunga cominciano
con "--". Sono disponibili opzioni in forma lunga sia per le
prestazioni specifiche di GNU, sia per quelle previste da POSIX.
Conformemente allo standard POSIX, le opzioni specifiche di gawk sono
indicate come argomenti dell'opzione -W. Si possono indicare pi
opzioni -W. Ogni opzione -W ha un equivalente in forma lunga, come
spiegato pi avanti. Gli argomenti delle opzioni in forma lunga pos-
sono essere uniti ad esse da un =, senza spazi, oppure sono indicati
nel successivo campo della linea di comando.
Gawk riconosce le seguenti opzioni.
-F fs
--field-separator fs
Usa fs come separatore dei campi in ingresso ("input field sepa-
rator"). il valore della variabile predefinita FS.
-v var=val
--assign var=val
Assegna il valore val alla variabile var prima di iniziare
l'esecuzione del programma. I valori dati in questo modo alle
variabili sono quindi disponibili gi nel blocco BEGIN dei pro-
grammi AWK.
-f file-di-programma
--file file-di-programma
Legge il programma AWK dal file file-di-programma anzich dal
primo argomento della linea di comando. Si possono dare pi
opzioni -f (o --file).
-mf NNN
-mr NNN
Fissa al valore NNN certi limiti di memoria. f decide il mas-
simo numero di campi, ed r la massima dimensione di una linea
(o, pi propriamente, di un record). Questi due indicatori
("flag"), e l'opzione -m, sono ereditati della versione di awk
per UNIX dei Bell Labs. gawk li ignora, dato che non ha limiti
predefiniti.
-W traditional
-W compat
--traditional
--compat
Con quest'opzione gawk funziona in modo compatibile ("compati-
bility mode"), cio si comporta esattamente come UNIX awk. Non
sar riconosciuta alcuna estensione specifica di GNU. La forma
--traditional
preferibile alle altre. Per ulteriori informazioni, si con-
sulti il paragrafo ESTENSIONI GNU.
-W copyleft
-W copyright
--copyleft
--copyright
Scrive su "standard output" la versione concisa del messaggio di
copyright di GNU e termina con successo.
-W help
-W usage
--help
--usage
Scrive su "standard output" un sommario relativamente breve
delle opzioni disponibili. In linea con le convenzioni di codi-
fica GNU, ("GNU Coding Standards"), queste opzioni provocano
un'uscita immediata e senza segnalazione di errore.
-W lint
--lint Sono prodotti messaggi d'avvertimento ("warning") relativi a
costrutti dubbi o non trasportabili su altre versioni di AWK.
-W lint-old
--lint-old
Sono prodotti messaggi d'avvertimento ("warning") relativi a
costrutti non trasportabili sulla versione originale di awk per
Unix.
-W posix
--posix
Quest'opzione imposta il "compatibility mode", con le seguenti
restrizioni aggiuntive :
+o Non sono riconosciute le sequenze \x.
+o Quando a FS
assegnato un sigolo spazio, solo spazi e TAB fungono da sepa-
ratori di campo, il carattere "newline" invece no.
+o Non riconosciuto il sinonimo func della parola chiave func-
tion.
+o Non si possono usare gli operatori ** e **= al posto di ^ and
^=.
+o La funzione fflush() non disponibile.
-W re-interval
--re-interval
Permette l'indicazione di espressioni intervallari ("interval
expression") nella valutazione di espressioni formali (che chi-
ameremo d'ora in poi "regular expression"; sono descritte in
dettaglio in un apposito capitolo, pi avanti). Le espressioni
intervallari non erano tradizionalmente disponibili nel linguag-
gio AWK. Lo standard POSIX le ha aggiunte per rendere awk ed
egrep coerenti tra loro. Con questa prestazione, tuttavia, i
vecchi programmi AWK probabilmente non funzionano pi. Per questo
gawk riconosce le espressioni intervallari solo se espressamente
richieste specificando questa opzione oppure --posix.
-W source testo-del-programma
--source testo-del-programma
Usa testo-del-programma come codice sorgente del programma AWK.
Quest'opzione permette di aggiungere in modo semplice funzioni
di libreria (raccolte in file indicati dalle opzioni -f e
--file) con codice sorgente dato nella linea di comando.
stata pensata per programmi di media e grande dimensione usati
all'interno di procedure di shell ("shell script").
-W version
--version
Scrive su "standard output" la versione di questa particolare
copia di gawk.
utile principalmente per sapere se la copia di gawk installata
correntemente aggiornata rispetto a ci che Free Software Foun-
dation sta distribuendo. In linea con le convenzioni di codi-
fica GNU ("GNU Coding Standards"), queste opzioni provocano
un'uscita immediata e senza segnalazione di errore.
-- Indica la fine delle opzioni. Permette di passare al programma
AWK stesso argomenti che comincino con "-", e quindi conformi
alla convenzione di passaggio dei parametri della maggior parte
delle applicazioni UNIX.
In modalit compatibile, tutte le altre opzioni sono segnalate come
illegali, e per il resto ignorate. Nell'uso normale le opzioni
sconosciute sono passate al programma nel vettore ARGV per l'elabo-
razione, purch il testo del programma sia dato in qualche modo. Ci
utile in particolare nel lancio del programma AWK tramite il meccanismo
di esecuzione automatica dell'interprete, realizzato dalla sequenza
"#!" all'inizio del file eseguibile.
Un programma AWK consiste in una sequenza di istruzioni ("statement")
del tipo "pattern-azione" ed, opzionalmente, definizioni di funzioni.
pattern { azione istruzioni }
function nome(lista di parametri) { istruzioni }
Gawk legge prima di tutto il programma sorgente da file-di-programma se
specificato, dagli argomenti di --source, o dal primo argomento non di
tipo opzione della linea di comando. Le opzioni -f e --source possono
essere usate pi volte nella linea di comando. Gawk legger il testo del
programma come se tutti i file-di-programma e il testo sorgente della
linea di comando fossero concatenati. Questo permette di realizzare
librerie di funzioni AWK senza bisogno di includerle in ogni nuovo pro-
gramma che le usi; inoltre si possono unire funzioni di libreria a pro-
grammi provenienti dalla linea di comando.
La variabile di ambiente AWKPATH specifica il percorso lungo il quale
cercare i file sorgenti indicati dall'opzione -f. Se questa variabile
non esiste, utilizzato il percorso ".:/usr/local/share/awk" (ma questo
percorso pu variare a seconda di come gawk sia stato compilato ed
installato). Se un nome di file dato all'opzione -f contiene il carat-
tere "/", non eseguita alcuna ricerca tramite percorso.
Gawk esegue i programmi nell'ordine seguente. Per prima cosa, realizza
tutti gli assegnamenti indicati dall'opzione -v. Successivamente, con-
verte i programmi in un formato interno. A questo punto esegue il
codice dei blocchi BEGIN, se presenti, infine legge ciascun file indi-
cato nel vettore ARGV. Se non ne indicato alcuno, gawk legge da
"standard input".
Se un nome di file nella linea di comando ha la forma var=val,
trattato come un assegnamento di variabile. Alla variabile var sar
assegnato il valore val. Quest'azione, che ha luogo dopo che tutti i
blocchi BEGIN sono stati eseguiti, utilissima per agire dinamicamente
sulle variabili che AWK usa per decidere come isolare i campi ed i
record in ingresso.
utile inoltre per controllare variabili di stato quando siano neces-
sari pi passi di elaborazione su un singolo file di dati.
Se il valore di un particolare elemento di ARGV
la stringa vuota (""), gawk lo salta.
Per ogni record in ingresso, gawk controlla se soddisfi qualcuna delle
configurazioni ("pattern"), specificate nel programma AWK. Per ogni
pattern compatibile col record, eseguita la corrispondente azione. I
pattern sono controllati nell'ordine in cui appaiono nel programma.
Infine, dopo che sono esauriti i dati in ingresso, gawk esegue il
codice negli eventuali blocchi END.
Le variabili di AWK sono dinamiche; iniziano ad esistere la prima volta
che le si usa. I loro valori sono numeri in virgola mobile, o stringhe,
o entrambe le cose, a seconda di come sono usati. Inoltre AWK dispone
di vettori monodimensionali; i vettori multidimensionali possono essere
simulati. Al lancio del programma sono impostate parecchie variabili
predefinite; saranno descritte di volta in volta quando sar necessario,
ed elencate pi avanti.
Record
Normalmente i record sono separati dal carattere "newline". Si pu con-
trollare il modo in cui i record sono separati grazie alla variabile
predefinita RS. Se RS contiene un qualsiasi carattere singolo, tale
carattere separer i record. Altrimenti, RS pu essere un'espressione
formale ("regular expression"): i record saranno separati della parte
di testo in ingresso compatibile con l'espressione. Tuttavia, nella
modalit compatibile ("compatibility mode")
preso in considerazione solo il primo carattere della stringa come
separatore. Se RS contiene la stringa nulla, i record sono separati da
righe vuote. Quando RS contiene la stringa nulla, il carattere "new-
line" ha sempre la funzione di separatore di campo in aggiunta a quello
indicato dalla variabile FS, qualunque sia.
Campi
Ogni volta che gawk legge un record lo spezza in campi, usando il val-
ore della variabile FS come separatore di campo. Se FS
un singolo carattere, i campi sono separati da quel carattere. Se FS
la stringa nulla, ogni singolo carattere del record diventa un diverso
campo. Diversamente, si presume che FS sia un'espressione formale
("regular expression") completa. Nel caso particolare in cui FS
un singolo spazio, i campi sono separati da sequenze di spazi, "tab" o
"newline" (ma si veda pi avanti la discussione dell'opzione --posix).
Si noti che il valore di IGNORECASE (vedi) influenza anche il modo in
cui i campi sono spezzati quando FS
una regular expression, e come i record vengano separati quando RS
una regular expression.
Se alla variabile FIELDWIDTHS
assegnata una lista di numeri separati da spazi, ogni campo consider-
ato di lunghezza fissa, e gawk spezza il record secondo le ampiezze
specificate. Il valore di FS
ignorato. Assegnando un nuovo valore a FS, si annulla l'effetto di
FIELDWIDTHS, e si ripristina il comportamento ordinario.
Ogni campo nel record in ingresso pu essere individuato dalla sua
posizione : $1, $2, e cos via. $0
l'intero record. Nello stesso modo, si pu anche assegnare un valore ad
un campo. Non necessario che i campi siano indicati da costanti:
n = 5
print $n
stampa il quinto campo del record d'ingresso. La variabile NF contiene
il numero di campi nel record corrente.
Riferimenti a campi inesistenti (cio campi oltre $NF) producono la
stringa vuota. Tuttavia, l'assegnamento ad un campo inesistente (per
esempio $(NF+2) = 5) provoca l'incremento del valore di NF, crea tutti
i campi intermedi assegnando loro la stringa nulla, e fa s che il val-
ore di $0 sia ricalcolato utilizzando OFS per separare i campi. Rifer-
imenti a campi con indice negativo producono un errore fatale. Il
decremento di NF provoca la perdita dei campi di indice superiore al
valore impostato, ed il ricalcolo di $0, utilizzando OFS per separare i
campi.
Variabili predefinite
Le variabili predefinite di gawk sono:
ARGC Il numero di argomenti della linea di comando (escluse le
opzioni proprie di gawk ed il programma sorgente).
ARGIND L'indice in ARGV del file correntemente elabolato.
ARGV Vettore degli argomenti della linea di comando. Il suo
indice va da 0 ad ARGC - 1. La modifica del contenuto di
ARGV permette di variare dinamicamente i file dei dati.
CONVFMT Il formato di conversione dei numeri, d'ufficio vale
"%.6g".
ENVIRON Un vettore contenente i valori dell'ambiente ("environ-
ment") corrente. Gli indici del vettore sono i nomi delle
variabili d'ambiente, e gli elementi contengono i valori
corrispondenti (per esempio, ENVIRON["HOME"] potrebbe
valere qualcosa come "/home/arnold"). La modifica di
questo vettore non si riflette sull'environment ereditato
dai programmi che gawk lancia per redirezione o con la fun-
zione system() (ci potrebbe cambiare in una futura versione
di gawk).
ERRNO Se ha luogo un errore di sistema in un redirezione o una
lettura fatte con getline, oppure in una close(), ERRNO
conterr una stringa descrivente l'errore.
FIELDWIDTHS Una lista di ampiezze di campo separate da spazi. Se
impostato, gawk analizza l'ingresso secondo campi di
lunghezza fissa, anzich usare il valore della variabile FS
come separatore di campo. Questa prestazione ancora nella
fase sperimentale; la sua semantica potrebbe cambiare con
l'evolvere di gawk.
FILENAME Il nome del file di ingresso corrente. Se non sono speci-
ficati file nella linea di comando, il valore di FILENAME
"-". Tuttavia, FILENAME
indefinito all'interno del blocco BEGIN.
FNR L'indice del record nel file di ingresso corrente.
FS Il separatore di campo, normalmente uno spazio. Si veda
Campi, sopra.
IGNORECASE Controlla la sensibilit alla distinzione tra maiuscole e
minuscole ("case-sensitivity") nella valutazione di tutte
le regular expression e nelle operazioni coinvolgenti
stringhe. Se IGNORECASE ha un valore diverso da zero,
allora il confronto di pattern nelle regole, il confronto
di stringhe, la separazione di campi tramite FS, la sepa-
razione di record tramite RS, gli operatori ~ e !~, e le
funzioni predefinte gensub(), gsub(), index(), match(),
split(), e sub() ignoreranno tutti la differenza tra maius-
cole e minuscole nelle operazioni coinvolgenti regular
expression. Cos, se IGNORECASE
diverso da zero, /aB/ si accorda con tutte queste stringhe
: "ab", "aB", "Ab", e "AB". Come per tutte le variabili di
AWK, il valore iniziale di IGNORECASE
zero, cosicch tutte le operazioni su regular expression e
su stringhe normalmente distinguono tra maiuscole e minus-
cole. Su Unix, utilizzato l'intero insieme di caratteri
ISO 8852-1 Latin-1 quando ignorata la distinzione tra
maiuscole e minuscole. NOTA: Nelle versioni di gawk prece-
denti la 3.0, IGNORECASE influenzava solo le operazioni
riguardanti regular expression. Ora ha effetto anche sul
confronto fra stringhe.
NF Il numero di campi nel record corrente.
NR Il numero totale di record incontrati finora.
OFMT Il formato d'uscita per i numeri, d'ufficio vale "%.6g".
OFS Il separatore di campi in uscita, normalmente uno spazio.
ORS Il separatore di record in uscita, normalmente la sequenza
di fine linea ("newline").
RS Il separatore di record in ingresso, normalmente "newline".
RT Il terminatore di record. gwak pone RT uguale al testo in
ingresso che corrisponde al carattere o alla regular
expression indicati in RS.
RSTART L'indice del primo carattere trovato conforme da match(),
oppure 0 se non ci sono corrispondenze.
RLENGTH la lunghezza della stringa trovata conforme da match();
oppure -1 se non ci sono corrispondenze.
SUBSEP Il carattere usato per separare indici multipli negli ele-
menti di un vettore, d'ufficio "\034".
Vettori
I vettori sono indicizzati da un'espressione tra parentesi quadre ([ e
]). Se l'espressione formata da una lista di espressioni (expr, expr
...) l'indice del vettore una stringa ottenuta concatenando i valori
(stringa) di ogni espressione, sepati dal valore della variabile SUB-
SEP. Questa prestazione sfruttata per simulare vettori multidimen-
sionali. Per esempio:
i = "A"; j = "B"; k = "C"
x[i, j, k] = "hello, world\n"
assegna la stringa "hello, world\n" all'elemento del vettore x il cui
indice la stringa "A\034B\034C". In AWK, tutti i vettori sono asso-
ciativi, cio indicizzati da valori di tipo stringa.
L'operatore in pu essere usato in istruzioni if o while per sapere se
un vettore preveda un certo valore come indice.
if (val in array)
print array[val]
Se il vettore ha indici multipli, si usi (i, j) in array.
Il costrutto in pu anche essere usato in un ciclo for per iterare su
tutti gli elementi di un vettore.
Un elemento di un vettore pu essere cancellato con l'istruzione delete.
delete pu anche essere usato per cancellare l'intero contenuto di un
vettore, basta specificare il nome del vettore stesso senza indici.
Tipi Di Variabili E Conversioni
Le variabili e i campi possono essere numeri in virgola mobile,
stringhe, o entrambe le cose. Come sia interpretato il valore di una
variabile dipende dal contesto. In un'espressione numerica, sar trat-
tato come numero; usato come stringa, sar trattato come tale.
Per fare in modo che una variabile sia trattata come numero, le si
sommi 0; per ottenere il trattamento come stringa, le si concateni la
stringa nulla.
Quando una stringa deve essere convertita a numero, la conversione
compiuta con atof(3). I numeri sono convertiti a stringhe usando
sprintf(3) col valore di CONVFMT come stringa di formato ed il valore
numerico della variabile come argomento. Tuttavia, anche se tutti i
numeri in AWK sono in virgola mobile ("float"), i valori privi di deci-
mali sono sempre convertiti come interi. Cos, dati
CONVFMT = "%2.2f"
a = 12
b = a ""
la variabile b ha un valore di tipo stringa di "12" e non "12.00".
Gawk esegue i confronti nel modo seguente: Se due variabili sono
numeriche, sono confrontate numericamente. Se una numerica e l'altra
una stringa interpretabile come numero, sono pure confrontate numerica-
mente. Negli altri casi, gli eventuali valori numerici sono convertiti
in stringhe, ed eseguito un confronto tra stringhe. Secondo lo stan-
dard POSIX, il confronto numerico dovrebbe aversi anche quando entrambe
le variabili fossero stringhe convertibili a numeri. Tuttavia, questo
chiaramente sbagliato, e gawk non lo fa.
Si noti che le costanti stringa, come "57", non sono stringhe
numeriche, ma solo costanti stringa. L'idea di "stringa numerica" si
applica solo ai campi, all'ingresso di getline, a FILENAME, agli ele-
menti di ARGV e di ENVIRON, ed agli elmenti di un vettore creato da
split() che abbiano le caratteristiche di una stringa numerica. L'idea
fondamentale che debbano essere trattati in questo modo solo i dati
forniti dall'utente ("user input"), e non altri.
Le variabili non inizializzate hanno come valore numerico 0, e come
valore di stringa "" (cio la stringa vuota, o stringa nulla).
AWK un linguaggio orientato alla linea. Il pattern va all'inizio,
l'azione a seguire. Le istruzioni dell'azione sono chiuse tra { e }.
Sia il pattern che l'azione possono mancare ma, naturalmente, non
entrabi. Se manca il pattern, l'azione eseguita per ogni record in
ingresso. Omettere invece l'azione equivale a specificare
{ print }
che stampa l'intero record.
I commenti cominciano col carattere "#", e continuano fino a fine riga.
Si possono separare le istruzioni con righe vuote. Un'istruzione
finisce normalmente con la fine della riga, a meno che non termini in
",", {, ?, :, &&, o ||. Le istruzioni in righe terminanti con do o
else continuano automaticamente alla riga successiva. Negli altri
casi, una riga terminante con un "\" continua alla successiva, e "new-
line" ignorato.
Si possono scrivere pi istruzioni sulla stessa linea separandole con
";". Questo si applica sia alle istruzioni all'interno di un'azione
(il caso pi comune), sia ai gruppi pattern-azione stessi.
Pattern
I pattern di AWK possono assume le forme seguenti:
BEGIN
END
/regular expression/
espressione di relazione
pattern && pattern
pattern || pattern
pattern ? pattern : pattern
(pattern)
! pattern
pattern1, pattern2
BEGIN e END sono due tipi speciali di pattern, che non dipendono dai
dati in ingresso. Le azioni di tutti i pattern BEGIN sono unite
insieme, come se tutte le istruzioni fossero scritte in un unico blocco
BEGIN, e sono eseguite prima che sia letto alcunch dall'igresso. Allo
stesso modo, tutti i blocchi END sono fusi insieme, ed eseguiti dopo
che tutti i dati in ingresso sono terminati o si incontrata
l'istruzione exit. BEGIN e END non possono essere combinati con altri
pattern in espressioni, inoltre l'azione associata ad essi obbligato-
ria.
Per i pattern nella forma /regular expression/ l'azione associata ese-
guita per ogni record in ingresso che sia conforme alla regular expres-
sion. Le "regular expression" hanno la stessa forma di quelle di
egrep(1), e sono descritte pi avanti.
In un'espressione relazionale si pu usare qualsiasi operatore definito
nella sezione sulla azioni, pi avanti. Generalmente l'espressione
relazionale utilizzata per verificare se certi campi si accordino con
determinate regular expression.
Gli operatori &&, ||, e ! sono rispettivamnete l'AND logico, l'OR
logico, ed il NOT logico. Come i loro equivalenti del linguaggio C,
valutano solo il numero di operandi strettamente necessario a decidere
il risultato, a partire da quello pi a sinistra ("short-circuit evalua-
tion"). Sono usati per combinare espressioni di pattern pi semplici.
Come nella maggior parte dei linguaggi, si possono usare parentesi per
cambiare l'ordine di valutazione.
L'operatore ?:
simile allo stesso operatore del C: se il primo pattern vero, allora
il pattern utilizzato per il test il secondo, altrimenti
il terzo. Dei pattern secondo e terzo, ne valutato sempre solo uno.
Un'espressione nella forma pattern1, pattern2
detta range pattern. Essa considera compatibili tutti i record a par-
tire da uno conforme a pattern1, fino ad uno conforme a pattern2, com-
preso. Non pu essere combinata con alcun'altra espressione.
Regular Expressions ("Espressioni Formali")
Le regular expression sono del tipo esteso che si trova in egrep. Sono
composte da caratteri secondo le regole seguenti:
c accetta il carattere (non speciale) c.
\c accetta il carattere c considerato letteralmente.
. accetta qualsiasi carattere, compreso "newline".
^ accetta l'inizio di una stringa.
$ accetta la fine di una stringa.
[abc...] lista di caratteri, accetta uno qualsiasi dei caratteri
abc....
[^abc...] lista di caratteri negata, accetta qualsiasi carattere
eccetto abc....
r1|r2 alternativa: accetta r1 oppure r2.
r1r2 concatenazione: accetta r1, e poi r2.
r+ accetta uno o pi r.
r* accetta zero o pi r.
r? accetta un r o nessuno.
(r) raggruppamento: accetta r.
r{n}
r{n,}
r{n,m} Uno o due numeri racchiusi tra graffe indicano un'"espres-
sione intervallare" ("interval expression"). Se c' un
numero tra graffe, la regular expression precedente r
ripetuta n volte. Se tra graffe ci sono due numeri separati
da virgola, r
ripetuta da n ad m volte. Se c' un numero seguito da una
virgola, r
ripetuta almeno n volte.
Le espresioni intervallari sono ammesse solo se nella linea
di comando specificata l'opzione --posix oppure --re-inter-
val.
\y accetta la stringa vuota all'inizio o alla fine di una
parola.
\B accetta la stringa vuota all'interno di una parola.
\< accetta la stringa vuota all'inizio di una parola.
\> accetta la stringa vuota alla fine di una parola.
\w accetta un qualsiasi carattere che possa far parte di una
parola, cio lettere, numeri o "_" ("underscore").
\W accetta un qualsiasi carattere che non possa far parte di
una parola.
accetta la stringa vuota all'inizio di una stringa.
\' accetta la stringa vuota alla fine di una stringa.
Le sequenze "\x" ("escape sequence") valide all'interno delle stringhe
(vedere oltre) sono ammesse anche nelle regular expression.
Le classi di caratteri sono una nuova prestazione introdotta nello
standard POSIX. Una classe di caratteri una speciale notazione per
indicare liste di caratteri accomunati da uno specifico attributo, i
costituenti delle quali possono variare a seconda della nazionalit e
dell'insieme di caratteri di sistema (detto comunenmente character set
o charset per brevit) correntemente attivi. Per esempio, la nozione di
"carattere alfabetico" valida negli Stati Uniti
diversa da quella valida in Francia.
Una classe di caratteri ammessa solo all'interno delle parentesi
quadre di una lista di caratteri di una regular expression. Le classi
di caratteri si rappresentano con [:, una parola chiave indicante la
classe, e :]. Queste sono le classi di caratteri definite dallo
standard POSIX:
[:alnum:]
Caratteri alfanumerici.
[:alpha:]
Caratteri alfabetici.
[:blank:]
Caratteri "spazio" e "tab".
[:cntrl:]
Caratteri di controllo.
[:digit:]
Caratteri numerici.
[:graph:]
Caratteri che siano sia stampabili che visibili (uno spazio
stampabile ma non visibile, mentre a
entrambe le cose).
[:lower:]
Caratteri alfabetici minuscoli.
[:print:]
Caratteri stampabili (cio caratteri che non siano di controllo).
[:punct:]
Caratteri di punteggiatura (cio caratteri che non siano n let-
tere, n cifre, n caratteri di controllo, n caratteri di
spaziatura).
[:space:]
Caratteri di spaziatura (come lo spazio, "tab", "formfeed", per
citarne solo alcuni).
[:upper:]
Caratteri alfabetici maiuscoli.
[:xdigit:]
Cifre esadecimali.
Per fare un esempio, prima dell'introduzione dello standard POSIX si
sarebbe dovuto scrivere /[A-Za-z0-9]/ per individuare caratteri alfanu-
merici. Qualora il "character set" vigente avesse compreso altri
caratteri alfanumerici, l'espressione non li avrebbe riconosciuti. Con
le classi di caratteri POSIX, si pu scrivere /[[:alnum:]]/, che trover
corrispondenza con tutti i caratteri alfabetici e numerici previsti dal
charset correntemente in uso.
Nelle liste di caratteri possono comparire due sequenze speciali
aggiuntive. Esse si applicano ai charset non ASCII, i quali possono
comprendere sia simboli singoli, chiamati "elementi di confronto tes-
tuale" ("collating elements") rappresentati da pi di un carattere, sia
gruppi di caratteri tra loro equivalenti ai fini del confronto testuale
("collating") o dell'ordinamento. Per esempio, in francese una "e"
semplice ed una con l'accento grave sono equivalenti.
Simboli di Confronto Testuale ("Collating Symbols")
Un simbolo di confronto testuale un elemento di confronto di pi
di un carettere chiuso tra [. e .]. Per esempio, se ch
un elemento di confronto testuale, allora [[.ch.]]
la regular expression che lo individua, mentre [ch]
una regular expression che individua o il carattere c, o il
carattere h.
Classi di Equivalenza ("Equivalence Classes")
Una classe di equivalenza un nome, dipendente dalla localit,
associato ad una lista di caratteri tra loro equivalenti. Il
nome racchiuso tra [= e =]. Per esempio, il nome e potrebbe
essere usato per rappresentare globalmente i caratteri e, ed .
In questo caso, [[=e]]
una regular expression compatibile con uno qualsiasi dei carat-
teri e, , ed .
Queste funzionalit sono molto apprezzabili quando la lingua corrente
non l'inglese. Le funzioni di libreria che gawk usa nella valutazione
di regular exopression riconoscono attualmente solo le classi di carat-
teri POSIX, non i simboli di confronto testuale n le classi di equiv-
alenza.
Gli operatori \y, \B, \<, \>, \w, \W, , ed \' sono specificit di gawk;
queste estensioni sono possibili grazie alle facilitazioni derivanti
dall'uso della libreria "regexp" di GNU.
Quelle che seguono sono le opzioni della linea di comando che control-
lano come gawk interpreti i caratteri nella regular expression.
Nessuna opzione
In assenza di indicazioni, gawk mette a disposizione tutte le
facilitazioni caratteristiche delle regular expression POSIX e
degli operatori GNU descritti prima. Tuttavia, le espressioni
intervallari non funzionano.
--posix
Sono riconosciute solo le regular expression POSIX, non gli
operatori GNU (per esempio, \w individua il carattere w). Sono
ammesse le espressioni intervallari.
--traditional
Le regular expression sono valutate secondo le regole del
tradizionale awk per Unix. N gli operatori GNU, n le espres-
sioni intervallari, n le classi di caratteri POSIX ([[:alnum:]]
e simili) funzionano. I caratteri descritti da sequenze ottali
o esadecimali sono trattati letteralmente, anche se rappresen-
tano metacaratteri di regular expression.
--re-interval
Sono permesse le espressioni intervallari, anche se stato spec-
ificato --traditional.
Azioni
Le istruzioni di azione sono rinchiuse tra graffe, { e }. Le
istruzioni del costrutto di azione possono essere assegnamenti o
istruzioni condizionali o iterative come si trovano nella maggior parte
dei linguaggi. Gli operatori, le strutture di controllo e le
istruzioni di input/output ricalcano le corrispondenti del linguaggio
C.
Operatori
Gli operatori di AWK, in ordine decrescente di precedenza, sono
(...) Raggruppamento
$ Riferimento a campi.
++ -- Incremento e decremento, sia prefisso che postfisso.
^ Elevamento a potenza (si pu anche usare ** al suo posto, e
**= nell'assegnamento con operatore).
+ - ! Pi e meno unari, e negazione logica.
* / % Moltiplicazione, divisione e resto.
+ - Addizione e sottrazione.
spazio Concatenazione di stringhe.
< >
<= >=
!= == I ben noti operatori di relazione.
~ !~ Controllo di conformit ("match") tra regular expression, e
controllo di non conformit. NOTA: Non usare una regular
expression costante (/foo/) come operando di sinistra di ~
o !~. Si indichi sempre la regular expression come
operando di destra. L'espressione /foo/ ~ exp ha lo stesso
significato di (($0 ~ /foo/) ~ exp). Non questo, in
genere, che ci si aspetta.
in Controllo di appartenenza ad un vettore.
&& AND logico.
|| OR logico.
?: L'espressione condizionale in stile C. Ha la forma expr1 ?
expr2 : expr3. Se expr1
vera, il valore dell'espressione expr2, altrimenti expr3.
valutata solo una delle due espressioni expr2 ed expr3.
= += -=
*= /= %= ^= Assegnamento. Sono riconosciuti sia l'assegnamento assoluto
(var = value) sia quello con operatore (le altre forme).
Istruzioni di controllo
Le istruzioni di controllo di AWK sono:
if (condizione) istruzione [ else istruzione ]
while (condizione) istruzione
do istruzione while (condizione)
for (expr1; expr2; expr3) istruzione
for (var in vettore) istruzione
break
continue
delete vettore[indice]
delete vettore
exit [ espressione ]
{ istruzione }
Istruzioni di I/O
Le istruzioni di input/output sono le seguenti:
close(file) Chiude un file (o una pipe, come si vedr pi
avanti).
getline Copia in $0 la prossima linea d'ingresso, e
ricalcola NF, NR, FNR.
getline <file Copia in $0 la prossima linea di file, e rical-
cola NF.
getline var Copia in var la prossima linea d'ingresso, e
ricalcola NR ed FNR.
getline var <file Copia in var la prossima linea di file.
next Cessa l'elaborazione della linea d'ingresso cor-
rente. letta la successiva, e l'elaborazione
ricomincia dal primo pattern del programma AWK.
Se non ci sono pi righe in ingresso, sono ese-
guiti i blocchi END, se presenti.
nextfile Cessa l'eleborazione del file di ingresso cor-
rente. La prossima linea sar letta dal file di
ingresso successivo. Sono aggiornati FILENAME ed
ARGIND, FNR
riportato ad 1, e l'elaborazione riprende dal
primo pattern del programma AWK. Se non ci sono
pi dati in ingresso, sono eseguiti gli eventuali
blocchi END. NOTA: Nelle precedenti versioni di
gawk si usavano le due distinte parole next file.
Quest'ultima forma ancora riconosciuta, ma
potrebbe non esserlo in futuro; per il momento
essa provoca l'emissione di un messaggio di
avvertimento.
print Stampa il record corrente, seguito dal valore
della variabile ORS.
print expr-list Stampa le espressioni indicate, separate dal val-
ore della variabile OFS. La linea prodotta ter-
mina col valore della variabile ORS.
print expr-list >file Stampa su file le espressioni indicate, separan-
dole col valore della variabile OFS. La linea
prodotta termina col valore della variabile ORS.
printf fmt, expr-list Stampa secondo formato.
printf fmt, expr-list >file
Stampa secondo formato su file.
system(cmd-line) Esegue il comando cmd-line, e ne restituisce il
valore d'uscita. (pu non essere disponibile sui
sistemi non-POSIX).
fflush([file]) Scarica il contenuto di tutti i buffer associati
al file o alla pipe aperti in scrittura file. Se
file non specificato, assunto lo standard out-
put. Se file
la stringa vuota, l'operazione eseguita su
tutti i file e le pipe aperti in scrittura.
Sono permessi anche altri tipi di redirezione. Per print e printf,
>>file accoda i caratteri prodotti a file, metre | command scrive su
una pipe. Allo stesso modo, command | getline legge da una pipe
l'uscita di "command". L'istruzione getline restituir 0 in caso di
fine file, e -1 in caso di errore.
L'istruzione printf
Le versioni di AWK dell'istruzione printf e della funzione sprintf()
(vedi pi avanti) accettano i seguenti formati di conversione:
%c Un carattere ASCII . Se l'argomento usato per %c
numerico, trattato come un carattere e stampato. Altrimenti
l'argomento di tipo stringa, e ne stampato solo il primo
carattere.
%d
%i Un numero decimale (parte intera).
%e
%E Un numero in virgola mobile nella forma [-]d.dddddde[+-]dd. Con
%E si ottiene E anzich e.
%f Un numero in virgola mobile nella forma [-]ddd.dddddd.
%g
%G Usa il pi corto tra i formati e ed f (o E ed f, nel caso di %G)
e sopprime gli zeri non significativi.
%o Un numero ottale senza segno (di nuovo, un intero).
%s Una stringa di caratteri.
%x
%X Un numero esadecimale senza segno (intero). %x usa i caratteri
abcdef, mentre %X usa ABCDEF.
%% Un singolo carattere %; nessun argomento convertito.
Tra % e la lettera di controllo possono comparire alcuni parametri
opzionali:
- L'espressione dovrebbe essere giustificata a sinistra
all'interno del proprio campo.
spazio Nelle conversioni numeriche, fa precedere ai valori positivi uno
spazio, ed ai valori negativi il segno "meno".
+ Il segno "pi" prima del modificatore di ampiezza (descritto pi
avanti) indica che nelle conversioni numeriche il segno deve
essere sempre prodotto, anche se il valore del dato positivo.
+ annulla l'effetto dello spazio.
# Usa una "forma alternativa" con certe lettere di controllo. Con
%o
aggiunto uno zero iniziale; con %x e %X sono aggiunti rispetti-
vamente 0x e 0X in caso di valore diverso da zero; con %e, %E, e
%f, il risultato conterr sempre il punto decimale; con %g, e %G,
gli zeri in coda non sono rimossi.
0 Uno 0 (zero) iniziale indica che la stringa risultante deve
essere completata da zeri anzich spazi. Questo vale anche per i
formati non numerici. Questo indicatore ha effetto solo quando
la larghezza del campo
maggiore di quella necessaria a contenere il valore da stam-
pare.
ampiezza
Un numero indicante l'ampiezza che il campo dovrebbe avere.
Normalmente il carattere di riempimento uno spazio, ma se si
usato l'indicatore 0, il carattere di riempimento lo zero.
.prec Un numero indicante la precisione da utilizzare nella stampa.
Con i formati %e, %E, e %f, specifica il numero di cifre che
dovranno comparire a destra del punto decimale. Con i formati
%g, e %G, specifica il massimo numero di cifre significative.
Con i formati %d, %o, %i, %u, %x, e %X, specifica il numero min-
imo di cifre da stampare. Con le stringhe, specifica il massimo
numero di caratteri della stringa che potranno essere stampati.
permessa la definizione dinamica di ampiezza e prec prevista dalla
funzione printf() dell'ANSI C. Un * al posto di ampiezza o prec far s
che i loro valori siano presi dalla lista degli argomenti di printf o
sprintf().
Nomi di file speciali
Nelle redirezioni di print o printf in un file, o di getline da un
file, gawk riconosce internamente certi nomi di file speciali, che per-
mettono di accedere a file descriptor ereditati dal processo genitore
di gawk (la shell, in genere), oppure ad informazioni riguardanti il
processo gawk corrente. I nomi speciali sono:
/dev/pid La lettura di questo file fornisce il PID del processo cor-
rente, in forma decimale e terminante con "newline".
/dev/ppid La lettura di questo file fornisce il PID del genitore del
processo corrente, in forma decimale e terminante con "new-
line".
/dev/pgrpid La lettura di questo file fornisce il "process group ID"
del processo corrente, in forma decimale e terminante con
"newline".
/dev/user La lettura di questo file fornisce una linea terminante con
"newline", i cui campi sono separati da spazi. $1
il valore della system call getuid(2), $2
il valore di geteuid(2), $3
il valore di getgid(2), e $4
il valore di getegid(2). Se ci sono campi addizionali,
sono i "group ID" dati da getgroups(2). I gruppi multipli
possono non essere realizzati su tutti i sistemi.
/dev/stdin Lo "standard input".
/dev/stdout Lo "standard output".
/dev/stderr Lo "standard error".
/dev/fd/n Il file associato al file descriptor aperto n.
Questi ultimi sono utili in particolare nell'emissione di messaggi.
Per esempio, si pu scrivere:
print "Che sf...ortuna!" > "/dev/stderr"
laddove, per ottenere lo stesso effetto, si sarebbe stati costretti a
scrivere
print "Che sf...ortuna!" | "cat 1>&2"
Questi nomi di file possono essere anche dati nella linea di comando
come nomi di file di dati.
Funzioni Numeriche
AWK ha le seguenti funzioni aritmetiche predefinite:
atan2(y, x) l'arcotangente di y/x in radianti.
cos(expr) coseno di expr (si aspetta radianti).
exp(expr) esponenziale.
int(expr) troncamento ad intero.
log(expr) logaritmo naturale.
rand() fornisce un numero casuale tra 0 ed 1.
sin(expr) seno di expr (si aspetta radianti).
sqrt(expr) radice quadrata.
srand([expr]) usa expr come nuovo seme per il generatore di numeri
casuali. Se expr non indicata, sar utilizzata la data
corrente. Il valore di ritorno il valore precedente del
seme.
Funzioni su Stringhe
Gawk offre le seguenti funzioni di stringa predefinite:
gensub(r, s, h [, t]) cerca nella stringa obiettivo t corrispondenze
con la regular expression r. Se h
una stringa che inizia con g o G, tutte le
corrispondenze con r sono sostituite con s;
altrimenti, h
un numero che indica la particolare corrispon-
denza con r che si vuole sostituire. Se t non
specificata, usato $0 al suo posto.
All'interno del testo di rimpiazzo s si pu uti-
lizzare la sequenza \n, dove n
una cifra tra 1 e 9, per indicare la parte di
testo che corrisponde all'n-esima sottoespres-
sione tra parentesi. La sequenza \0 rappre-
senta il testo ricoperto dall'intera espres-
sione, e cos pure il carattere &. A differenza
di sub() e gsub(), la stringa modificata data
come risulatato della funzione; l'originale
resta inalterata.
gsub(r, s [, t]) per ogni sottostringa conforme alla regular
expression r nella stringa t, sostituisce la
stringa s, e restituisce il numero di sosti-
tuzioni. Se t non specificata, usa $0. Una &
nel testo di rimpiazzo sostituita dal testo
trovato conforme con la regular expression. Si
usi \& per indicare il carattere & inteso let-
teralmente. Si veda AWK Language Programming
per una pi ampia discussione circa le regole
che riguardano & e i "backslash" nel testo di
rimpiazzo di sub(), gsub(), e gensub().
index(s, t) trova l'indice posizionale della stringa t
nella stringa s, o 0 se t non presente.
length([s]) la lunghezza della stringa s, oppure la
lunghezza di $0 se s non specificata.
match(s, r) trova la posizione in s del tratto che si con-
forma alla regular expression r, oppure 0 se
non ci sono conformt. I valori di RSTART ed
RLENGTH sono modificati di conseguenza.
split(s, a [, r]) spezza la stringa s nel vettore a utilizzando
il metodo di separazione descritto dalla regu-
lar expression r, e restituisce il numero di
campi. Se r
omessa, il separatore utilizzato FS. Il
precedente contenuto del vettore a
cancellato. La divisione di una stringa in
parti e l'isolamento dei campi nei record,
descritto prima, sono compiuti esattamente allo
stesso modo.
sprintf(fmt, expr-list) stampa (in modo fittizio) expr-list secondo il
formato fmt, e restituisce la stringa risul-
tante.
sub(r, s [, t]) come gsub(), ma sostituita solo la prima sot-
tostringa trovata.
substr(s, i [, n]) restituisce la sottostringa di s di n caratteri
alpi che inizia nella posizione i. Se n
omesso, usato il resto di s.
tolower(str) restituisce una copia della stringa str, con
tutti i caratteri maiuscoli tradotti nei minus-
coli corrispondenti. I caratteri non alfa-
betici restano invariati.
toupper(str) restituisce una copia della stringa str, con
tutti i caratteri minuscoli tradotti nei maius-
coli corrispondenti. I caratteri non alfa-
betici restano invariati.
Funzioni di Tempo
Poich uno dei principali campi di applicazione dei programmi AWK
l'elaborazione di file di traccia ("log files") contenenti infor-
mazioni di tipo marcatempo ("time stamp"), gawk mette a disposizione le
seguenti due funzioni per ottenere marcatori di tempo e per manipo-
larli.
systime() restituisce la data e l'ora correnti, espresse come numero di
secondi trascorsi da una certa data convenzionale (la mezzan-
otte del 1/1/1970 sui sistemi POSIX).
strftime([format [, timestamp]])
Applica il formato format a timestamp. timestamp dovrebbe
essere nella forma utilizzata da systime(). Se timestamp
omesso, sono utilizzate la data e l'ora correnti. Se format
omesso, assunto un formato equivalente a quello utilizzato
dal comando date(1). Per sapere quali formati di conversione
siano disponibili, si faccia riferimento alle specifiche
della funzione strftime() del C ANSI. Una versione di pub-
blico dominio di strftime(3) e le relative pagine di manuale
sono distribuite con gawk; se gawk
stato compilato utilizzando tale versione di strftime, potr
eseguire tutte le conversioni descritte nel manuale associ-
ato.
Constanti di tipo Stringa
Le costanti di tipo stringa in AWK sono sequenze di caratteri chiuse
tra doppi apici ("). All'interno delle stringhe, sono riconosciute
certe sequenze di escape ("escape sequences"), come nel linguaggio C :
\\ Un carattere "\" singolo.
\a Il carattere "alert"; di solito si tratta del carattere ASCII BEL
(^G).
\b backspace : ASCII BS (^H).
\f form-feed : ASCII FF (^L).
\n newline (^J).
\r carriage return (^M).
\t horizontal tab (^I).
\v vertical tab (^V).
\xhex digits
Il carattere rappresentato dalla stringa di cifre esadecimali che
segue \x. Come nel C ANSI, tutte le cifre esadecimali seguenti
sono considerate parte della sequenza (questa prestazione la dice
lunga su come il comitato abbia redatto le specifiche del linguag-
gio). Per esempio, "\x1B" il carattere ASCII ESC (escape).
\ddd Il carattere rappresentato dalla sequenza di una, due o tre cifre
ottali. Esempio: "\033" il carattere ASCII ESC (escape).
\c Il carattere c, cos com'.
Le sequenze di escape possono anche essere utilizzate all'interno di
regular expression (per esempio, /[ \t\f\n\r\v]/ descrive i caratteri
di spaziatura).
In modalit compatibile i caratteri rappresentati da sequenze ottali ed
esadecimali sono trattati letteralmente quando usati in costanti conte-
nenti regular expression. Cos, /a\52b/ equivale a /a\*b/.
Le funzioni in AWK sono definite in questo modo:
function nome(lista-di-parametri) { istruzioni }
Le funzioni sono eseguite in seguito a chiamate dall'interno di espres-
sioni, che possono comparire sia all'interno di pattern, sia
all'interno di azioni. I parametri attuali dati al momento della chia-
mata istanziano i parametri formali dichiarati nella funzione. I vet-
tori sono passati per riferimento, le altre variabili per valore.
Poich le funzioni non erano in origine previste nel linguaggio AWK, la
gestione delle variabili locali piuttosto goffa: sono dichiarate sem-
plicemente come parametri in pi nella lista dei parametri formali. Per
convenzione, si usa separare le variabili locali dai veri parametri con
qualche spazio in pi nella lista. Per esempio:
function f(p, q, a, b) # "a" e "b" sono locali
{
.....
}
/abc/ { ... ; f(1, 2) ; ... }
La parentesi di sinistra di una chiamata deve seguire immediatamente il
nome della funzione, senza spazi in mezzo; questo per evitare l'ambi-
guit sintattica con l'operatore di concatenazione. Questa restrizione
non si applica alle funzioni predefinite elencate prima.
Le funzioni possono chiamare a loro volta altre funzioni, e possono
essere ricorsive. I parametri utilizzati come variabili locali sono
inizializzati alla stringa nulla ed al numero zero al momento
dell'invocazione.
Se stata data l'opzione --lint, gawk avvertir in caso di chiamate a
funzioni indefinite al momento della valutazione sintattica del pro-
gramma anzich durante l'esecuzione. La chiamata di una funzione
indefinita in fase di esecuzione
un errore fatale.
Si pu usare la parola func al posto di function.
Stampa ed ordina i nomi di login di tutti gli utenti:
BEGIN { FS = ":" }
{ print $1 | "sort" }
Conta le righe di un file:
{ nlines++ }
END { print nlines }
Aggiunge il numero di linea alle righe di un file:
{ print FNR, $0 }
Variazione sul tema:
{ print NR, $0 }
egrep(1), getpid(2), getppid(2), getpgrp(2), getuid(2), geteuid(2),
getgid(2), getegid(2), getgroups(2)
The AWK Programming Language, Alfred V. Aho, Brian W. Kernighan, Peter
J. Weinberger, Addison-Wesley, 1988. ISBN 0-201-07981-X.
AWK Language Programming, Edition 1.0, pubblicata da Free Software
Foundation, 1995.
Un obiettivo di primaria importanza per gawk
la compatibilit con lo standard POSIX, cos come con la pi recente ver-
sione di awk per UNIX. A tal fine, gawk incorpora le seguenti
prestazioni non descritte nel manuale del linguaggio, ma facenti parte
della versione dei Bell Labs di awk, e previste dallo standard POSIX.
L'opzione -v per l'assegnamento di variabili prima dell'esecuzione del
programma
una novit. Secondo il libro, l'assegnamento di variabili da linea di
comando ha luogo nel momento in cui awk utilizza l'argomento come even-
tuale nome di file da aprire in lettura, la qual cosa avviene dopo che
sono stati eseguiti tutti i blocchi BEGIN. Tuttavia, nelle versioni pi
recenti, gli assegnamenti avvengono prima dell'esecuzione di BEGIN, a
patto che precedano tutti i nomi di file nella linea di comando. Le
applicazioni hanno finito col dipendere da questa "prestazione".
Quando awk fu modificato per allinearlo con la sua documentazione, fu
aggiunta quest'opzione per venire incontro alle applicazioni che confi-
davano nel vecchio comportamento. (questa funzionalit stata accolta
sia dagli sviluppatori di AT&T, sia da quelli di GNU).
L'opzione -W per l'attivazione di prestazioni specifiche della versione
proviene dallo standard POSIX.
Nell'esame degli argomenti, gawk interpreta l'opzione speciale "--"
come marcatore della fine della lista. In modalit compatibile segnala,
ma per il resto ignora, le opzioni indefinite. Nella modalit ordi-
naria, tali argomenti sono passati al programma AWK perch possa elabo-
rarli.
Il manuale di AWK non definisce il valore di ritorno di srand(). Lo
standard POSIX prevede che la funzione restituisca il seme corrente,
per poter controllare la sequenza di generazione dei numeri casuali.
Perci, anche srand() di gawk restituisce il seme corrente.
Nuove prestazioni sono anche le seguenti: l'uso di pi di un'opzione -f
(da MKS awk); il vettore ENVIRON; le escape sequence \a, e \v (origi-
nali di gawk ma aggiunte in seguito anche da AT&T); le funzioni predef-
inite tolower() e toupper() (da AT&T); e le specifiche di conversione
del C ANSI per printf (da AT&T).
Gawk aggiunge alcune estensioni a POSIX awk, descritte in questa
sezione. Tutte le estensioni qui documentate possono essere disabili-
tate con l'opzione --traditional.
Le seguenti funzionalit di gawk non sono disponibili in POSIX awk.
+o L'escape sequence \x. (disabilitata con --posix).
+o La funzione fllush(). (disabilitata con --posix).
+o Le funzioni systime(), strftime() e gensub().
+o I nomi di file speciali per la redirezione dell'I/O.
+o Le variabili ARGIND, ERRNO ed RT.
+o La variabile IGNORECASE, con i suoi effetti collaterali.
+o La variabile FIELDWIDTHS e la possibilit di isolare campi di
lunghezza fissa.
+o L'uso di RS come regular expression.
+o La possibilit di isolare i singoli caratteri assegnando la
strimga vuota ad FS ed al terzo argomento di split().
+o La ricerca tramite percorso predefinito per i file indicati
con l'opzione -f, e la variabile AWKPATH.
+o Il costrutto nextfile per abbandonare l'elaborazione del file
corrente.
+o Il costrutto delete array per cancellare l'intero contenuto di
un vettore.
Il manuale di AWK non definisce il valore di ritorno di close(). Per
Gawk, close() restituisce il valore di fclose(3), per la chiusura di
file ordinari, o pclose(3), per la chiusura di pipe.
Quando gawk
lanciato con l'opzione --traditional, e l'argomento fs dell'opzione -F
"t", ad FS
assegnato il carattere "tab". Si noti che se si digita gawk -F\t ...
si ottiene solo di forzare la shell a considerare "t" alla lettera, e
non di passare "\t" all'opzione -F. Poich si tratta di un caso parti-
colare abbastanza brutto, questo comportamento non ha luogo nella
modalit ordinaria, e neppure quando si specifichi --posix. Il modo
migliore per definire davvero un carattere "tab" come separatore di
campo
usare gli apici: gawk -F'\t' ....
Gawk supporta due prestazioni caratteristiche delle prime realizzazioni
di AWK. La prima la possibilit di chiamare la funzione predefinita
length() non solo senza argomenti, ma anche senza parentesi ! Cos
a = length # Il sacro Algol 60, Batman!
equivale a
a = length()
a = length($0)
Questa prestazione segnalata come "deprecabile" nello standard POSIX,
e gawk emette un messaggio di avvertimento riguardo il suo uso se
specificata l'opzione --lint.
La seconda prestazione "storica" l'uso delle istruzioni continue e
break fuori dal corpo di cicli while, for, o do. Le versioni
tradizionali di AWK consideravano tali costrutti equivalenti
all'istruzione next. Gawk permette questa sintassi se specificato
--traditional.
Se esiste la variabile d'ambiente POSIXLY_CORRECT, gawk si comporter
esattamente come se fosse stato specificato --posix nella linea di
comando. Se specificato --lint, gawk emetter un messaggio di avverti-
mento consono.
Si pu utilizzare la variabile di ambiente AWKPATH per indicare una
lista di directory dove gawk cercher i file indicati dalle opzioni -f e
--file.
L'opzione -F non necessaria, dato che possibile l'assegnamento a
variabili qualsiasi da linea di comando; rimane solo per compatibilit
all'indietro.
Se il sistema operativo fornisce un supporto per /dev/fd ed i file
associati /dev/stdin, /dev/stdout, e /dev/stderr, gawk pu produrre dati
in uscita diversi da quelli che si avrebbero su sistemi privi di tale
supporto. Quando gawk interpreta quei file internamente, sincronizza
la scrittura sullo standard output con la scrittura su /dev/stdout,
mentre su di un sistema che riconosca quei file, la scrittura attual-
mente diretta verso file descriptor diversi. "Caveat emptor".
I programmi contenenti singoli caratteri sintatticamente errati tendono
a riempire lo stack dell'analizzatore grammaticale, generando un mes-
saggio di scarsa utilit. Programmi di questo genere sono sorprendente-
mente difficili da diagnosticare nel caso generale, e lo sforzo per
farlo non vale davvero il risultato.
Questo manuale documenta gawk, versione 3.02.
La versione originale di awk per UNIX
stata progettata e realizzata da Alfred Aho, Peter Weinberger, e Brian
Kernighan degli AT&T Bell Labs. Brian Kernighan ne continua la manuten-
zione ed il miglioramento.
Paul Rubin e Jay Fenlason, della Free Software Foundation, hanno
scritto gawk facendo riferimeto per compatibilit alla versione origi-
nale di awk distribuita con Seventh Edition UNIX. John Woods ha con-
tribuito correggendo un buon numero di errori. David Trueman, col con-
tributo di Arnold Robbins, ha reso gawk compatibile con la nuova ver-
sione di UNIX awk. Arnold Robbins l'attuale manutentore.
Il trasporto su DOS stato fatto inizialmente da Conrad Kwok e Scott
Garfinkle. Scott Deifik l'attuale responsabile della versione per
DOS. Pat Rankin ha curato il trasporto su VMS, e Michal Jaegermann
quello su Atari ST. Il trasporto su OS/2 stato realizzato da Kai Uwe
Rommel, con l'aiuto di Darrel Hankerson. Fred Fish ha prodotto la ver-
sione per Amiga.
Documentazione tradotta da Giuseppe Guerrini (giusguer-
rini [AT] racine.it).
Chi trovasse bachi in gawk, pu segnalarli per posta elettronica a
bug-gnu-util [AT] prep.edu, con "carbon copy" a
arnold [AT] gnu.edu. Si prega di specificare il tipo e la versione
del proprio sistema operativo, la versione di gawk, il compilatore uti-
lizzato per compilarlo, ed un programma di prova completo di dati, il
pi corto possibile, che evidenzi il problema.
Prima di inviare una segnalazione di baco, bisogna fare due cose.
Innanzi tutto, verificare se si sta usando la versione pi recente di
gawk: ogni nuova distribuzione corregge molti bachi, in genere i pi
subdoli; se quella in uso non aggiornata,
probabile che il problema sia gi stato risolto. La seconda cosa da
fare leggere attentamente queste pagine ed il manuale di riferimento,
per essere sicuri che ci che si pensa un errore non sia piuttosto un
cavillo del linguaggio.
Si prega di NON inviare segnalazioni di bachi a comp.lang.awk. Bench
gli sviluppatori di gawk frequentino occasionalmente questo newsgroup,
inviare l le segnalazioni di bachi non affidabile. Invitiamo invece
tutti ad utilizzare gli indirizzi di posta elettronica dati sopra.
Ringraziamo Brian Kernighan dei Bell Labs, che ha dato consideravole
assistenza durante le fasi di test e debug.
NOTA DEL TRADUTTORE: Il testo seguente lasciato nella sua forma origi-
nale perch manca l'approvazione ufficiale della sua traduzione da parte
di Free Software Foundation. In coda all'originale abbiamo aggiunto una
versione in italiano, che per da considerare informale e legalmente
non valida. Il solo testo la cui presenza renda ridistribuibile il doc-
umento, e la cui assenza configuri una violazione della licenza,
quello in lingua inglese.
Copyright (C) 1996 Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of this
manual page provided the copyright notice and this permission notice
are preserved on all copies.
Permission is granted to copy and distribute modified versions of this
manual page under the conditions for verbatim copying, provided that
the entire resulting derived work is distributed under the terms of a
permission notice identical to this one.
Permission is granted to copy and distribute translations of this man-
ual page into another language, under the above conditions for modified
versions, except that this permission notice may be stated in a trans-
lation approved by the Foundation.
Copyright (C) 1996 Free Software Foundation, Inc. Propriet letteraria
della Free Software Foundation, 1996.
permesso stampare e distribure copie letterali di questa pagina del
manuale, a patto che la nota di propriet letteraria e questa parte sui
permessi di ristampa siano preservate in tutte le copie.
permesso copiare e distribuire versioni modificate di questa pagina
del manuale, sotto le condizioni poste per la copia letterale, a patto
che l'intero lavoro derivato sia distribuito secondo permessi di ris-
tampa identici a questi.
permesso copiare e distribuire traduzioni di questa pagina del manuale
in un'altra lingua, sotto le condizioni poste sopra per le versioni
modificate, salvo che quest'informazione sui permessi di copia e ris-
tampa deve essere espressa in una traduzione approvata dalla Free Soft-
ware Foundation.
Free Software Foundation 19 dec 1996 GAWK(1)