Successivo: , Precedente: , Su: Getline   [Contenuti][Indice]


4.10.5 Usare getline da una pipe

L’onniscienza ha molti aspetti positivi. Se non si può ottenerla, l’attenzione ai dettagli può aiutare.

Brian Kernighan

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 BWK awk.) Alcune versioni invece lo trattano come ‘"echo " ("date" | getline)’. (Questo è il comportamento di mawk.) In breve, per evitare problemi, è sempre meglio usare parentesi esplicite.


Successivo: , Precedente: , Su: Getline   [Contenuti][Indice]