捕获脚本输出以实时将日期时间添加到输出中

捕获脚本输出以实时将日期时间添加到输出中

我希望实时捕获 shell 脚本执行的输出,以便用提供日期和时间的信息来丰富它。

为了说明这一点,我有一个这种类型的脚本,不得修改

#!/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] 等待2秒...
2021-06-16 11:44:50 [INFO] 等待3秒...
2021-06-16 11:44:53 [INFO] 等待1秒...

我使用以下 shell 函数在运行我的初始脚本的脚本中进行格式化:

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 循环在读取时很好地捕获了脚本的输出,但是我同时(执行结束时)获取了所有行,因此所有行都具有相同的日期时间。我尝试在每次脚本生成一行时获取行,而不是在执行结束时获取行。

答案1

ts包中的命令正是moreutils您要寻找的:

./script.sh | ts

它有多种格式化时间戳的选项。例如,

ts '%F %T [INFO]'

将为您提供问题中使用的确切格式。

答案2

您可以使用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

相关内容