您能在用 tee 编写的每一行前面加上当前日期和时间吗?

您能在用 tee 编写的每一行前面加上当前日期和时间吗?

我正在使用“tee”命令来将长 bash 命令的结果捕获到文件中。

我使用 tee 发出的文件能否以某种方式在每行前面加上写入该行的时间戳?我正在寻找一种解决方案,其中每行都有不同的日期时间值...而不是在每行前面加上相同的值。

我这样做的原因是当我阅读文件以了解缓慢的区域在哪里时,知道每一行何时发出会非常有用。

答案1

如果 tee 不能执行某项操作,则将其通过管道传输到可以执行该操作的程序。更多工具有一个名为的工具,ts其目的正是如此:

$ echo 测试| ts
2 月 02 日 13:17:27 测试

如果你想加时间戳一切,用法很明显:

myapp | ts | tee app.log

还有其他组合也是可能的;例如,仅为屏幕输出或仅为日志文件添加时间戳:

myapp | tee app.log | ts
myapp | tee >(ts > app.log)
myapp | tee /dev/tty | ts > app.log
myapp | pee "ts > app.log" "cat"
myapp | pee "cat > app.log" "ts"

(是的,最后一个也来自moreutils。)

答案2

替代方案ts

echo "foo" | stdbuf -o0 sed 's/%/%%/g' | xargs -d '\n' -I {} date '+%F %T {}' | tee -a "/tmp/foo.log"

输出:

# cat "/tmp/foo.log"
2022-02-24 09:43:00 foo

将 stdout 和 stderr 记录到文件的示例(删除/dev/null以写入终端):

exec &> >(stdbuf -o0 sed 's/%/%%/g' | xargs -d '\n' -I {} date '+%F %T {}' | tee -a "/tmp/std.log" >/dev/null )

另一种方法是使用awk

echo "foo" | xargs -d'\n' -I{} echo '{}' | awk '{ print strftime("%F %T"), $0; fflush(); }' | tee -a "/tmp/foo.log"

相关内容