如何在Bash中将stdout重定向到文件时添加时间戳?

won*_*dra 22 linux bash redirect

我有一个程序(服务器),我正在寻找一种方法(脚本),它将所有stdout文件重定向(或更好地复制)并为每个条目添加时间戳.

我已经完成了一些研究,我能得到的最远的就是如何将时间戳添加到STDERR重定向.它重定向stdout但添加的时间戳是脚本完成的时间:

#!/bin/bash
./server | ./predate.sh > log.txt
Run Code Online (Sandbox Code Playgroud)

代码predate.sh:

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

似乎退出程序后刷新服务器输出.(没有重定向它工作正常).此外,如果我尝试predate.sh在提到的线程中使用给定的示例,它可以完美地工作.我知道在主程序中添加时间戳很容易,但我宁愿避免编辑它的代码.

oli*_*ver 39

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

我现在使用的是什么.像这样:

picocom -b 115200 /dev/tty.usbserial-1a122C | awk '{ print strftime("%s: "), $0; fflush(); }' | tee serial.txt
Run Code Online (Sandbox Code Playgroud)
  • 输出通过picocom管道输送到awk
  • awk预先设定日期(该%s选项将时间转换为自1970-01-01 00:00:00 UTC以来的秒数 - 或%c用于人类可读的格式)
  • fflush() 刷新所有缓冲的输出awk
  • 通过管道将tee其转移到文件中.(你可以tee 在这里找到一些东西)

  • 非常感谢你.我想添加到使用此功能的任何人,打印类似"2015-11-13 17:04:57:"的时间戳,模式为"%Y-%m-%d%H:%M:%S: ". (9认同)
  • 这是我唯一的输出:“awk:第 2 行:函数 strftime 从未定义” (3认同)
  • Awk,永远在救援. (2认同)
  • 也许先安装gawk:/sf/ask/257894871/ (2认同)

Cir*_*四事件 8

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
Run Code Online (Sandbox Code Playgroud)

或从计划开始算起:

$ (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    
Run Code Online (Sandbox Code Playgroud)

或者用于基准测试的增量:

$ (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
Run Code Online (Sandbox Code Playgroud)

另请参阅:如何监视每行stdout在Bash中作为基准测试的最后输出行的时间长度?

在Ubuntu 18.04上测试,moreutils 0.60.


Ash*_*ish 5

对我来说你的代码工作得很好

检查这是我试过的

test.sh

#!/bin/bash

while true; do
  echo "hello"
done
Run Code Online (Sandbox Code Playgroud)

predate.sh

#!/bin/bash

while read line; do
  echo $(date) ":" $line;    
done
Run Code Online (Sandbox Code Playgroud)

然后

./test.sh  | ./predate.sh
Run Code Online (Sandbox Code Playgroud)

给我

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
Run Code Online (Sandbox Code Playgroud)

可以使用">"或">>"将其重定向到某个文件以进行追加

检查快照


小智 -3

如果我理解你的问题是将 stderr 输出包含在 log.txt 文件中。正确的 ?如果这就是您想要的解决方案是:

./服务器2>&1 | ./predate.sh > log.txt

问候