我希望实时捕获 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