Bash – 如何在将stdoutredirect到文件时添加时间戳

我有一个程序(服务器),我正在寻找一种方式(脚本),将redirect(或更好地复制)其所有的stdout文件,并为每个条目添加时间戳。 我已经做了一些研究,最远的我可以得到感谢如何添加时间戳STDERRredirect 。 它redirectstdout但添加的时间戳是脚本结束的时间:

 #!/bin/bash ./server | ./predate.sh > log.txt 

predate.sh代码:

 #!/bin/bash while read line ; do echo "$(date): ${line}" done 

我是一个Linux初学者,我显然错过了一些非常重要的东西,因为看起来服务器输出在程序退出后被刷新(没有redirect它工作正常)。 另外,如果我尝试使用predate.sh在给定的例子中提到的线程,它完美的作品。 我知道这很容易添加一个时间戳到主程序,但我宁愿避免编辑它的代码。

编辑:唯一的工作答案在评论

我最近需要的是:在串行控制台(picocom)中接收日志消息,将它们打印到终端和文件,并预先设定日期。

我现在用的是s.th. 喜欢这个:

 picocom -b 115200 /dev/tty.usbserial-1a122C | awk '{ print strftime("%s: "), $0; fflush(); }' | tee serial.txt 
  • picocom的输出picocom送到awk
  • awk prepends日期( %s选项将时间转换为自1970-01-01 00:00:00 UTC以来的秒数 – 或者使用%c作为人类可读的格式)
  • fflush()awk 刷新任何缓冲的输出
  • 这是通过管道将其转移到一个文件。 (你可以在这里找到关于tee一些东西)

对于我你的代码工作得很好

检查这是我试过的

test.sh

 #!/bin/bash while true; do echo "hello" done 

predate.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 

这可以使用“>”或“>>”重定向到某个文件进行追加

检查快照

如果我明白你的问题是在你的log.txt文件中包含stderr输出。 对 ? 如果这就是你想要的解决方案是:

./server 2>&1 | ./predate.sh> log.txt

问候

我使用上面的例子:picocom -b 115200 /dev/tty.usbserial-1a122C | awk'{print strftime(“%s:”),$ 0; fflush(); }'| tee serial.txt

转储/重定向日志文件中的telnet输出数据,但我不能在后台运行我的脚本。 如果我使用'&'来运行它的背景,那么它不起作用。

第一点:没有“&”的工作命令:脚本:dumpper.sh telnet $ 1 $ 2 | awk'{print strftime(“%s:”),$ 0;}'| tee $ host。$ port.log;

命令:./dumpper.sh 16.1.1.8 202

第一点:不能用'&'命令:脚本:dumpper.sh telnet $ 1 $ 2 | awk'{print strftime(“%s:”),$ 0;}'| tee $ host。$ port.log 2>&1;

命令:./dumpper.sh 16.1.1.8 20224&

我正在运行这样的cron工作:

 0 * * * * user /home/user/script.sh >>stdout.log 

然后在script.sh中,我有这样的东西:

 #!/bin/bash date do_some_code 

由于“日期”是我的script.sh的标准输出的一部分,时间戳是每个stdout.log条目中的第一行。