Eventuali duplicati:
Capturing multiple line output to a bash variableShell scripting, negozio di uscita comando nella variabile e mantenere la formattazione
ho quello che è probabilmente una domanda di base di scripting, ma non sono stato in grado di trova una risposta ovunque io abbia guardato.
Ho uno script awk che elabora un file e sputa un elenco di sistemi disabilitati. Uscita Quando chiamo manualmente dalla riga di comando, vengo formattato indietro:
$awk -f awkscript datafile
The following notifications are currently disabled:
host: bar
host: foo
Sto scrivendo uno script wrapper per chiamare dal mio crontab, che si svolgerà lo script awk, determinare se non v'è alcun output, e scrivimi se c'è. Sembra (semplificato):
BODY=`awk -f awkscript datafile`
if [ -n "$BODY" ]
then
echo $BODY | mailx -s "Disabled notifications" [email protected]
else
echo "Nothing is disabled"
fi
Quando eseguito in questo modo, e confermato con l'aggiunta di un echo $BODY
nella sceneggiatura, l'uscita è spogliato della formattazione (a capo sono principalmente quello che mi riguarda con), così ho ottenere l'output che assomiglia:
The following notitifications are currently disabled: host: bar host: foo
sto cercando di capire come mantenere la formattazione che è presente, se faccio funzionare l'ordine manualmente.
Le cose che ho provato finora:
echo -e `cat datafile | awkscript` > /tmp/tmpfile
echo -e /tmp/tmpfile
Ho provato questo perché sul mio sistema (Solaris 5.10), utilizzando eco senza il -e ignora sequenze di escape standard come \ n. Non ha funzionato Ho controllato il file tmp e non ha alcuna formattazione, quindi il problema si verifica quando si memorizza l'output, non quando lo si stampa.
BODY="$(awk -f awkscript datafile)"
echo -e "$BODY"
Ho provato questo perché tutto quello che ho trovato, tra cui alcune altre domande qui su StackOverflow ha detto che il problema era che il guscio avrebbe sostituito i codici di spaziatura con spazi se non è stato citato. Non ha funzionato
Ho provato a usare printf invece di echo, usando $ (comando) invece di `command`, e usando un tempfile invece di una variabile per memorizzare l'output, ma nulla sembra mantenere la formattazione.
Cosa mi manca, o c'è un altro modo per fare ciò che evita questo problema tutti insieme?
Non è possibile utilizzare un file di output? – fge
Vuoi dire che lo script awk genera un file di output, invece di stampare l'output su stdout? Stavo solo indagando su cosa sarebbe implicato in questo. So che posso reindirizzare le azioni di stampa in awk su un file, devo solo controllare che si aggiungano invece di clobber. – Madasi
Puoi accodare a un file usando '>>' dalla shell invece di '>'. '>' effettivamente clobbers, ma '>>' aggiunge. – fge