variable una salida resultado guardar forma ejemplos directorio cómo cuál correcta comando cadena buscar batch asignar archivo actual awk pipe

awk - una - Asignación de salida del comando del sistema a la variable



guardar la salida de un comando en una variable batch (5)

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 .


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


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


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)


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}''