Захватить вывод сценария, чтобы добавить дату и время для вывода в реальном времени

Я хочу записать вывод выполнения сценария оболочки в реальном времени, чтобы обогатить его информацией, содержащей дату и время.

Для иллюстрации у меня есть, например, сценарий этого типа, который я не должен изменять :

#!/bin/bash
for i in 2 3 1
do
  echo "Waiting for $i seconds ..."
  sleep $i
done

Сценарий выдает следующий результат:

Waiting for 2 seconds ...
Waiting for 3 seconds ...
Waiting for 1 seconds ...

Я пытаюсь создать вывод типа :

2021-06-16 11:44:48 [INFO] Waiting for 2 seconds ...
2021-06-16 11:44:50 [INFO] Waiting for 3 seconds ...
2021-06-16 11:44:53 [INFO] Waiting for 1 seconds ...

Я использую следующие функции оболочки для форматирования в скрипте, который запускает мой начальный скрипт:

function log {
   echo `date +%Y-%m-%d" "%H:%M:%S`" $@"
   if [ "$LOGFILE" != "" ]
   then
      echo `date +%Y-%m-%d" "%H:%M:%S`" $@" >>$LOGFILE
   fi
}

function loginf {
   log "[INFO] $@"
}

Я очень хорошо справляюсь с циклом while при чтении для захвата вывода моего скрипта, но я получаю все строки в в одно и то же время (конец его выполнения) и, следовательно, все строки имеют одинаковое значение даты и времени. Я пытаюсь получить строки каждый раз, когда скрипт создает строку, а не в конце выполнения.

3
задан 16 June 2021 в 16:34

2 ответа

Команда ts из пакета moreutils делает именно то, что вы ищете:

./script.sh | ts

Она имеет различные параметры для форматирования отметки времени. Например,

ts '%F %T [INFO]'

предоставит вам точный формат, который вы используете в своем вопросе.

2
ответ дан 28 July 2021 в 11:28

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

./your_script.sh | ts

. Если вам нужно что-то портативное, работающее в системах, где ts не установлен, вы можете сделать это простым while цикл с использованием встроенной команды read :

./your_script.sh | while read line; do echo "$(date +'%Y-%m-%d %H:%M:%S') [INFO] $line"; done
0
ответ дан 28 July 2021 в 11:28

Другие вопросы по тегам:

Похожие вопросы: