Successivo: Getline variabile pipe, Precedente: Getline variabile file, Su: Getline [Contenuti][Indice]
getline
da una pipeL’onniscienza ha molti aspetti positivi. Se non si può ottenerla, l’attenzione ai dettagli può aiutare.
L’output di un comando può anche essere convogliato in getline
, usando
‘comando | getline’. In
questo caso, la stringa comando viene eseguita come comando di shell e
il suo output è passato ad awk
per essere usato come input.
Questa forma di getline
legge un record alla volta dalla pipe.
Per esempio, il seguente programma copia il suo input nel suo output,
ad eccezione delle righe che iniziano con ‘@execute’, che sono
sostituite dall’output prodotto dall’esecuzione del resto della riga
costituito da un comando di shell.
{ if ($1 == "@execute") { tmp = substr($0, 10) # Rimuove "@execute" while ((tmp | getline) > 0) print close(tmp) } else print }
La funzione close()
viene chiamata per assicurarsi che, se appaiono
nell’input due righe ‘@execute’ identiche, il comando sia eseguito per
ciascuna di esse.
Vedi la sezione Chiudere ridirezioni in input e in output.
Dato l’input:
pippo pluto paperino @execute who gastone
il programma potrebbe produrre:
pippo pluto paperino arnold ttyv0 Jul 13 14:22 miriam ttyp0 Jul 13 14:23 (murphy:0) bill ttyp1 Jul 13 14:23 (murphy:0) gastone
Si osservi che questo programma ha eseguito who
e stampato il
risultato. (Eseguendo questo programma, è chiaro che ciascun utente otterrà
risultati diversi, a seconda di chi è collegato al sistema.)
Questa variante di getline
divide il record in campi, imposta il valore
di NF
, e ricalcola il valore di $0
. I valori di
NR
e FNR
non vengono cambiati.
Viene impostato RT
.
Per lo standard POSIX, ‘espressione | getline’ è ambiguo se
espressione contiene operatori che non sono all’interno di parentesi,
ad esclusione di ‘$’. Per esempio,
‘"echo " "date" | getline’ è ambiguo perché
l’operatore di concatenazione non è tra parentesi. Si dovrebbe scrivere
invece ‘("echo " "date") | getline’, se il programma dev’essere
portabile su tutte le implementazioni di awk
.
NOTA: Sfortunatamente,
gawk
non ha un comportamento uniforme nel trattare un costrutto come ‘"echo " "date" | getline’. La maggior parte delle versioni, compresa la versione corrente, lo tratta come ‘("echo " "date") | getline’. (Questo è anche il comportamento di BWKawk
.) Alcune versioni invece lo trattano come ‘"echo " ("date" | getline)’. (Questo è il comportamento dimawk
.) In breve, per evitare problemi, è sempre meglio usare parentesi esplicite.
Successivo: Getline variabile pipe, Precedente: Getline variabile file, Su: Getline [Contenuti][Indice]