[英]How to add timestamp while redirecting stdout to file in Bash?
我有一个程序(服务器),我正在寻找一种方法(脚本),将其所有stdout
重定向(或更好地复制)到文件并为每个条目添加时间戳。
我做了一些研究,我能得到的最远的结果是感谢How to add timestamp to STDERR redirection 。 它重定向stdout
但添加的时间戳是脚本完成的时间:
#!/bin/bash
./server | ./predate.sh > log.txt
predate.sh
代码:
#!/bin/bash
while read line ; do
echo "$(date): ${line}"
done
似乎服务器输出在程序退出后被刷新。(没有重定向它工作正常)。 此外,如果我尝试在提到的线程中的给定示例上使用predate.sh
,它可以完美运行。 我知道向主程序添加时间戳很容易,但我宁愿避免编辑其代码。
我最近正好需要:在串行控制台 (picocom) 中接收日志消息,将它们打印到终端和文件,并在前面加上日期。
我现在使用的看起来很糟糕。 像这样:
picocom -b 115200 /dev/tty.usbserial-1a122C | awk '{ print strftime("%s: "), $0; fflush(); }' | tee serial.txt
moreutils ts
绝对日期和时间是默认值:
$ sudo apt-get install moreutils
$ (echo a;sleep 1;echo b;sleep 3;echo c;sleep 2;echo d;sleep 1) | ts | tee myfile
$ cat myfile
Apr 13 03:10:44 a
Apr 13 03:10:45 b
Apr 13 03:10:48 c
Apr 13 03:10:50 d
或从程序开始计数ts -s
:
$ (echo a; sleep 1; echo b; sleep 3; echo c; sleep 2; echo d; sleep 1) | ts -s
00:00:00 a
00:00:01 b
00:00:04 c
00:00:06 d
或使用ts -i
进行基准测试的增量:
$ (echo a; sleep 1; echo b; sleep 3; echo c; sleep 2; echo d; sleep 1) | ts -i
00:00:00 a
00:00:01 b
00:00:03 c
00:00:02 d
$ (echo a; sleep 1; echo b; sleep 3; echo c; sleep 2; echo d; sleep 1) | ts -i '%.s'
0.000010 a
0.983308 b
3.001129 c
2.001120 d
另请参阅: 如何监视每行 stdout 是 Bash 中用于基准测试的最后输出行的时间?
在 Ubuntu 18.04、moreutils 0.60 上测试。
对我而言,您的代码运行良好
检查这是我尝试过的
测试文件
#!/bin/bash
while true; do
echo "hello"
done
早于.sh
#!/bin/bash
while read line; do
echo $(date) ":" $line;
done
然后
./test.sh | ./predate.sh
给我
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
这可以使用“>”或“>>”进行附加重定向到某个文件
同样,使用moreutils
ts
,您只需在脚本顶部使用 exec 即可。
#!/bin/bash
exec > >(ts>>file.log)
echo hello 1
echo hello 2
sleep 5
echo hello 3
如果我理解您的问题是在 log.txt 文件中包含 stderr 输出。 对 ? 如果那是您想要的解决方案是:
./服务器 2>&1 | ./predate.sh > log.txt
问候
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.