Рейтинг:3

Захват вывода скрипта для добавления даты и времени к выводу в реальном времени

флаг cn

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

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

#!/бин/баш
для я в 2 3 1
делать
  echo "Ожидание $i секунд..."
  спать $ я
сделано

Скрипт выдает следующий вывод:

Ждем 2 секунды...
Ждем 3 секунды...
Ожидание 1 секунды...

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

2021-06-16 11:44:48 [ИНФО] Ожидание 2 секунды...
2021-06-16 11:44:50 [INFO] Ожидание 3 секунды...
2021-06-16 11:44:53 [INFO] Ожидание 1 секунды...

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

журнал функций {
   echo `дата +%Y-%m-%d" "%H:%M:%S`" $@"
   если [ "$LOGFILE" != "" ]
   тогда
      echo `date +%Y-%m-%d" "%H:%M:%S`" $@" >>$LOGFILE
   фи
}

функция логин {
   журнал "[INFO] $@"
}

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

pLumo avatar
флаг in
Как вы называете свой первоначальный сценарий? Это хорошо работает для меня: `./script1.sh | в то время как IFS= читать -r l; сделать логинf "$l"; сделано`. См. также https://serverfault.com/questions/72744/command-to-prepend-string-to-each-line.
bac0n avatar
флаг cn
`./script.sh | ts "%Y-%m-%d %H:%M:%S [ИНФОРМАЦИЯ]"`
raj avatar
флаг cn
raj
Я создал сценарий, содержащий две ваши функции, а затем следующий код: `while { read; } войти в системуf $REPLY; сделано`. Запуск `./script1 | ./script2` (где `script1` — ваш первый сценарий, а `script2` — вышеупомянутый сценарий) дает мне правильный вывод, т.е. разные временные метки.
bac0n avatar
флаг cn
на самом деле не нужно использовать `echo`, можно просто `f(){ date "+%Y-%m-%d %H:%M:%S [INFO] $*"; }; f один два три`
bac0n avatar
флаг cn
`f(){ printf '%(%Y-%m-%d %H:%M:%S)T [%s] %s\n' -1 INFO "$*"; }; раз, два, три, еще лучше...
Рейтинг:2
флаг us

тс команда из пакета больше утилит делает именно то, что вы ищете:

./script.sh | тс

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

ts '%F %T [ИНФОРМАЦИЯ]'

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

Рейтинг:0
флаг cn
vog

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

./ваш_скрипт.ш | тс

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

./ваш_скрипт.ш | при чтении строки; do echo "$(date +'%Y-%m-%d %H:%M:%S') [INFO] $line"; сделано

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.