Asignación de salida del comando del sistema a la variable

Quiero ejecutar el comando del system en un script awk y obtener su salida almacenada en una variable. He intentado hacer esto, pero la salida del comando siempre va al shell y no puedo capturarlo. ¿Alguna idea sobre cómo se puede hacer esto?

Ejemplo:

 $ date | awk --field-separator=! {$1 = system("strip $1"); /*more processing*/} 

Debería llamar al comando strip system y, en lugar de enviar la salida al shell, debería asignar la salida a $1 para más procesamiento. Rignt ahora, está enviando salida a shell y asignando el código de comando a $1 .

Nota: Coprocess es específico de GNU awk. De todos modos, otra alternativa es usar getline

 cmd = "strip "$1 while ( ( cmd | getline result ) > 0 ) { print result } close(cmd) 

Descubierto.

Usamos la E / S bidireccional de awk

 { "strip $1" |& getline $1 } 

pasa $ 1 a la tira y el getline toma la salida de la tira a $ 1

Para ejecutar un comando del sistema en awk , puede usar system() o cmd | getline cmd | getline .

Prefiero cmd | getline cmd | getline porque le permite capturar el valor en una variable:

 $ awk 'BEGIN {"date" | getline mydate; close("date"); print "returns", mydate}' returns Thu Jul 28 10:16:55 CEST 2016 

De manera más general, puede establecer el comando en una variable:

 awk 'BEGIN { cmd = "date -j -f %s" cmd | getline mydate close(cmd) }' 

Tenga en cuenta que es importante utilizar close() para evitar obtener un error de “hace demasiados archivos abiertos” si tiene resultados múltiples (gracias mateuscb para señalar esto en los comentarios).


Usando system() , la salida del comando se imprime automáticamente y el valor que puede capturar es su código de retorno:

 $ awk 'BEGIN {d=system("date"); print "returns", d}' Thu Jul 28 10:16:12 CEST 2016 returns 0 $ awk 'BEGIN {d=system("ls -l asdfasdfasd"); print "returns", d}' ls: cannot access asdfasdfasd: No such file or directory returns 2 
 gawk '{dt=substr($4,2,11); gsub(/\//," ",dt); "date -d \""dt"\" +%s"|getline ts; print ts}' 

Ejemplo útil cuando necesitas procesar el resultado de grep:

 echo "some/path/exex.c:some text" | awk -F: '{ "basename "$1"" |& getline $1; print $1 " ==> " $2}' 

-F: uso : como separador de campo

"basename "$1"" ejecuta el comando de shell con el primer campo

|& getline $1 salida de lectura del comando de shell en substream

 output: exex.c ==> some text