Поэтому я хочу заняться журналированием и для этого поставить дату перед выводом bash-скрипта. Проблема в том, что он имеет несколько строк вывода. Я могу только поставить дату перед всем выводом. Но тогда у меня есть строка без даты в журналах. Конечно, я могу предположить, что дата из строки выше совпадает, но я надеялся, что есть решение. Заранее спасибо!
Это мой скрипт, который вызывает другой скрипт:
#!/bin/sh
echo $(date "+%F %T") : starting script
echo $(date "+%F %T") : $(./script.sh)
echo $(date "+%F %T") :script ended
Это вывод:
2012-07-26 15:34:12 : starting script
2012-07-26 15:35:14 : First line of output
second line of output
2012-07-26 15:35:17 : script ended
И это то, что я хотел бы иметь:
2012-07-26 15:34:12 : starting script
2012-07-26 15:35:14 : First line of output
2012-07-26 15:35:15 : second line of output
2012-07-26 15:35:17 : script ended
Ответы:
По аналогичному вопросу о переполнении стека , есть 2 отличных варианта.
awk ( ответ )
аннотировать ( ответить )
annotate - это небольшой bash-скрипт, который можно получить напрямую по приведенной здесь ссылке или в системах на основе Debian через пакет
devscripts
(в формеannotate-output
).источник
Я думаю, что вы можете использовать awk для этого:
(см. http://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html для форматирования даты, возвращаемой strftime ())
источник
awk: calling undefined function strftime
- это специфично дляgawk
?Ты можешь использовать
awk
awk
берет входной поток и модифицирует его вывод. Этот скрипт говорит: «печать d с последующим исходным выводом», а затем заполняетсяd
датой.источник
date
выражение только один раз, так что все такие строки печатаются одновременно?Это напечатает текущую дату и время перед каждой строкой вывода
./script.sh
:Как это работает
set -f
отключает расширение bash (илиecho *
не печатает настоящую звездочку).while read -r LINE; do ... done
сохраняет одну строку вывода в переменной$LINE
и выполняется...
до тех пор, пока не будут обработаны все строки.echo $ (date "+% F% T"): "$ LINE" печатает строку с текущим временем и датой.
set +f
снова включает расширение bash, чтобы оно не мешало остальной части сценария bash.источник
sed
вставляет одну и ту же дату, непосредственно перед запуском второго скрипта. Вероятно, не то, что хочет пользователь ...ls
. Просто попробуйте свой сценарий со следующимscript.sh
:#!/bin/bash
(новая строка)echo 1 ; sleep 1 ; echo 2 ; sleep 2 ; echo 3 ; sleep 3 ; echo 4
read
сwhile
циклом вместо цикла for.