Powiel możliwe:
Capturing multiple line output to a bash variableShell skryptów, przechowywać dane wyjściowe polecenia w zmiennej i zachować formatowanie
mam co jest chyba podstawowe pytanie skryptów, ale nie udało się znajdź odpowiedź gdziekolwiek spojrzę.
Mam skrypt awk, który przetwarza plik i wypluwa listę wyłączonych systemów. Gdy zgłoszę go ręcznie z poziomu wiersza poleceń, mam sformatowane wyjście z powrotem:
$awk -f awkscript datafile
The following notifications are currently disabled:
host: bar
host: foo
Piszę skrypt otoki, aby zadzwonić z mojego crontab, który będzie realizowany scenariusz awk, ustalić, czy istnieją jakiekolwiek wyjście, a napisz do mnie, jeśli jest. To wygląda jak (uproszczony):
BODY=`awk -f awkscript datafile`
if [ -n "$BODY" ]
then
echo $BODY | mailx -s "Disabled notifications" [email protected]
else
echo "Nothing is disabled"
fi
Uruchomiony w ten sposób, i potwierdzona przez dodanie echo $BODY
do skryptu, wyjście jest pozbawiony formatowania (nowe linie są głównie co Martwię się), więc Uzyskaj dane wyjściowe, które wyglądają następująco:
The following notitifications are currently disabled: host: bar host: foo
Próbuję dowiedzieć się, jak zachować formatowanie, które jest obecne, jeśli uruchomię polecenie ręcznie.
Czego próbowałem dotąd:
echo -e `cat datafile | awkscript` > /tmp/tmpfile
echo -e /tmp/tmpfile
Próbowałem to, bo w moim systemie (Solaris 5.10), używając echo bez -e ignoruje standardowe sekwencje jak \ n. Nie działa. Sprawdziłem plik tmp i nie ma on w nim żadnego formatowania, więc problem występuje podczas zapisywania danych wyjściowych, a nie podczas drukowania.
BODY="$(awk -f awkscript datafile)"
echo -e "$BODY"
Próbowałem to, bo wszystko udało mi się znaleźć, w tym niektóre inne pytania tutaj na stackoverflow powiedział, że problemem było to, że powłoka będzie zastąpić kody białych znaków ze spacjami, jeżeli nie zostało podane. Nie działa.
Próbowałem użyć printf zamiast echa, używając $ (polecenie) zamiast `command`, i używając tempfile zamiast zmiennej do przechowywania danych wyjściowych, ale nic nie zachowuje formatowania.
Czego mi brakuje lub czy istnieje inny sposób, aby to zrobić, aby uniknąć tego problemu?
Nie używa pliku wyjściowego opcja? – fge
Masz na myśli to, że skrypt awk generuje plik wyjściowy, zamiast drukowania wyjściowego na standardowe wyjście? Właśnie sprawdzałem, co by się w to wplątało. Wiem, że mogę przekierować akcje drukowania w awk do pliku, po prostu muszę sprawdzić, czy dołączają zamiast clobbera. – Madasi
Możesz dołączyć do pliku używając '>>' z powłoki zamiast '>'. '>' rzeczywiście clobbers, ale '>>' dołącza. – fge