我最后在Python中为此编写了一个快速的小脚本,但我想知道是否有一个实用程序可以提供文本,其中每个行前面都有一些文本 - 在我的特定情况下,是一个时间戳.理想情况下,使用方式如下:
cat somefile.txt | prepend-timestamp
(在你回答sed之前,我试过这个:
cat somefile.txt | sed "s/^/`date`/"
但是,这只会在执行sed时评估date命令,因此每行都会错误地添加相同的时间戳.)
ts
from moreutils会为你提供的每一行输入添加一个时间戳.您也可以使用strftime对其进行格式化.
$ echo 'foo bar baz' | ts Mar 21 18:07:28 foo bar baz $ echo 'blah blah blah' | ts '%F %T' 2012-03-21 18:07:30 blah blah blah $
要安装它:
sudo apt-get install moreutils
可以尝试使用awk
:
| awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; fflush(); }'
您可能需要确保
生成行缓冲输出,即它在每行之后刷新其输出流; 时间戳awk
添加将是该行的结尾出现在其输入管道上的时间.
如果awk显示错误,请尝试gawk
改为.
注释,可通过该链接或annotate-output
在Debian devscripts
包中获得.
$ echo -e "a\nb\nc" > lines $ annotate-output cat lines 17:00:47 I: Started cat lines 17:00:47 O: a 17:00:47 O: b 17:00:47 O: c 17:00:47 I: Finished with exitcode 0
将给出的答案提炼为最简单的答案:
unbuffer $COMMAND | ts
在Ubuntu上,它们来自expect-dev和moreutils包.
sudo apt-get install expect-dev moreutils
这个怎么样?
cat somefile.txt | perl -pne 'print scalar(localtime()), " ";'
从您希望获得实时时间戳来判断,也许您想要在日志文件或其他内容上进行实时更新?也许
tail -f /path/to/log | perl -pne 'print scalar(localtime()), " ";' > /path/to/log-with-timestamps
只是要把它扔出去:daemontools中有一对名为tai64n和tai64nlocal的实用程序,它们用于预先记录时间戳以记录消息.
例:
cat file | tai64n | tai64nlocal
Kieron的答案是迄今为止最好的答案.如果您遇到问题,因为第一个程序正在缓冲它,您可以使用unbuffer程序:
unbuffer| awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; }'
它默认安装在大多数Linux系统上.如果你需要自己构建它,它是expect包的一部分
http://expect.nist.gov
使用read(1)命令从标准输入一次读取一行,然后使用date(1)以您选择的格式输出前面带有日期的行.
$ cat timestamp #!/bin/sh while read line do echo `date` $line done $ cat somefile.txt | ./timestamp