Duplicar posibles:
Capturing multiple line output to a bash variableShell scripting, tienda de salida del comando en la variable y conservar el formato
tengo lo que es probablemente una cuestión básica de secuencias de comandos, pero no he podido encontrar una respuesta en cualquier lugar que he buscado.
Tengo un script awk que procesa un archivo, y escupe una lista de sistemas deshabilitados. salida cuando llamo manualmente desde la línea de comandos, consigo formateado posterior:
$awk -f awkscript datafile
The following notifications are currently disabled:
host: bar
host: foo
Estoy escribiendo un guión envoltorio para llamar desde mi crontab, que se desarrollará el guión awk, determinar si hay alguna salida, y envíeme un correo electrónico si hay. Parece que (simplificado):
BODY=`awk -f awkscript datafile`
if [ -n "$BODY" ]
then
echo $BODY | mailx -s "Disabled notifications" [email protected]
else
echo "Nothing is disabled"
fi
Cuando se realiza de esta manera, y se confirma mediante la adición de un echo $BODY
en el guión, la salida es despojado del formato (saltos de línea son principalmente lo que me preocupa), por lo que obtener una salida que se parece a:
The following notitifications are currently disabled: host: bar host: foo
estoy tratando de encontrar la manera de conservar el formato que está presente si funciono con el comando manualmente.
Cosas que he probado hasta ahora:
echo -e `cat datafile | awkscript` > /tmp/tmpfile
echo -e /tmp/tmpfile
He intentado esto porque en mi sistema (Solaris 5.10), utilizando eco sin el -e hace caso omiso de las secuencias de escape estándar como \ n. No funcionó Revisé el archivo tmp y no tiene ningún formato, por lo que el problema está sucediendo al almacenar la salida, no al imprimirla.
BODY="$(awk -f awkscript datafile)"
echo -e "$BODY"
yo probamos este, porque todo lo que pude encontrar, incluyendo algunas otras preguntas aquí en stackoverflow dijo que el problema era que la cáscara reemplazaría códigos de espacio en blanco con espacios si no fue citado. No funcionó
He intentado usar printf en lugar de echo, usando $ (comando) en vez de `comando`, y usando un archivo de temp en lugar de una variable para almacenar el resultado, pero nada parece retener el formato.
¿Qué me estoy perdiendo, o hay otra forma de hacerlo que evite este problema?
¿No está utilizando un archivo de salida una opción? – fge
¿Quiere decir que el script awk genera un archivo de salida, en lugar de imprimir el resultado a stdout? Solo estaba investigando qué implicaría eso. Sé que puedo redirigir las acciones de impresión en awk a un archivo, solo tengo que verificar que se agreguen en lugar de clobber. – Madasi
Puede adjuntar a un archivo usando '>>' del shell en lugar de '>'. '>' ciertamente clobbers, pero '>>' se agrega. – fge