9

Поэтому я хочу заняться журналированием и для этого поставить дату перед выводом 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

4 ответа4

9

Согласно аналогичному вопросу о переполнении стека, есть 2 отличных варианта.

awk (ответ)

<command> | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; }'

аннотировать (ответить)

annotate - это небольшой bash-скрипт, который можно получить напрямую по приведенной здесь ссылке, или в системах на основе Debian - через пакет devscripts (в форме annotate-output).

3

Я думаю, что вы можете использовать awk для этого:

./script.sh | awk '{ print strftime()" : "$0; }'

(см. http://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html для форматирования даты, возвращаемой strftime())

2

Вы можете использовать awk

./script.sh | awk '{ print d,$1}' "d=$(date "+%F %T")"

awk принимает входной поток и модифицирует его вывод. Этот скрипт говорит: "печать d с последующим исходным выводом", а затем заполняет d датой.

1

Это напечатает текущую дату и время перед каждой строкой вывода ./script.sh:

set -f
./script.sh | while read -r LINE; do echo $(date "+%F %T") : "$LINE"; done
set +f

Как это устроено

  • set -f отключает расширение bash (иначе echo * не напечатает настоящую звездочку).

  • while read -r LINE; do ... done сохраняет одну строку вывода в переменной $LINE и выполняет ... , пока все строки не будут обработаны.

  • echo $ (date "+% F% T"): "$ LINE" печатает строку с текущим временем и датой.

  • set +f снова включает расширение bash, чтобы оно не мешало остальной части скрипта bash.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .