当前位置:  开发笔记 > 编程语言 > 正文

是否有一个Unix实用程序来为stdin添加时间戳?

如何解决《是否有一个Unix实用程序来为stdin添加时间戳?》经验,为你挑选了8个好方法。

我最后在Python中为此编写了一个快速的小脚本,但我想知道是否有一个实用程序可以提供文本,其中每个行前面都有一些文本 - 在我的特定情况下,是一个时间戳.理想情况下,使用方式如下:

cat somefile.txt | prepend-timestamp

(在你回答sed之前,我试过这个:

cat somefile.txt | sed "s/^/`date`/"

但是,这只会在执行sed时评估date命令,因此每行都会错误地添加相同的时间戳.)



1> 小智..:

tsfrom 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


同时捕获和标记stderr:`bad command 2>&1 | ts`结果在`Jan 29 19:58:31 -bash:bad:command not found`
对于OS X,`brew install moreutils`.要输出UTC,您可以在本地设置TZ,例如`ls -l | TZ = UTC ts'%Y-%m-%dT%H:%M:%SZ'

2> Kieron..:

可以尝试使用awk:

 | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; fflush(); }'

您可能需要确保生成行缓冲输出,即它在每行之后刷新其输出流; 时间戳awk添加将是该行的结尾出现在其输入管道上的时间.

如果awk显示错误,请尝试gawk改为.


在我的系统'awk'本身就是缓冲.(这对日志文件可能有问题).我通过使用:awk'{print strftime("%Y-%m-%dT%H:%M:%S"),$ 0; fflush(); }"
strftime()似乎是一个GNU awk扩展,所以如果你在Mac OS上,例如,使用gawk而不是awk.
@teh_senaus据我所知,`awk`的`strftime()`没有毫秒精度.但是您可以使用`date`命令.基本上你只需要将纳秒修剪为三个字符.它看起来像这样:`COMMAND | 读取-r线; 做回声"$(日期'+%Y-%m-%d%T.%3N')$ line"; done`.请注意,您可以使用%T缩写%H:%M:%S.如果由于某种原因仍想使用`awk`,可以执行以下操作:`COMMAND | awk'{"日期+%Y-%m-%d \\%T.%3N"| getline时间戳; 打印时间戳,$ 0; fflush(); }'`
对于OS X用户,你必须安装`gawk`并使用它而不是`awk`.如果您有MacPorts:`sudo port install gawk`

3> Ted Percival..:

注释,可通过该链接或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



4> Willem..:

将给出的答案提炼为最简单的答案:

unbuffer $COMMAND | ts

在Ubuntu上,它们来自expect-dev和moreutils包.

sudo apt-get install expect-dev moreutils


如果您希望以毫秒精度获得经过的时间,请使用`unbuffer $ COMMAND | ts -s%.s`(`-s`表示经过时间,' - .s`表示时间,以秒表示,小数部分)

5> jj33..:

这个怎么样?

cat somefile.txt | perl -pne 'print scalar(localtime()), " ";'

从您希望获得实时时间戳来判断,也许您想要在日志文件或其他内容上进行实时更新?也许

tail -f /path/to/log | perl -pne 'print scalar(localtime()), " ";' > /path/to/log-with-timestamps


这个perl示例对我来说特别有用,因为我作为ubuntu部署的用户工作,显然使用'mawk'而不是'gawk' - 并且没有strftime函数.谢谢!
+1在默认的Ubuntu安装上很方便.我使用`tail -f/path/to/log | perl -pne'使用POSIX qw(strftime); print strftime"%Y-%m-%dT%H:%M:%SZ",gmtime();'`获取ISO8601/RFC3339样式日期而不是更简单版本产生的wacko日期.
您可以将perl脚本进一步缩短为只需`ls | perl -pne'print localtime.""'` 标量转换由于字符串连接而发生.

6> chazomaticus..:

只是要把它扔出去:daemontools中有一对名为tai64n和tai64nlocal的实用程序,它们用于预先记录时间戳以记录消息.

例:

cat file | tai64n | tai64nlocal



7> Mark Harriso..:

Kieron的答案是迄今为止最好的答案.如果您遇到问题,因为第一个程序正在缓冲它,您可以使用unbuffer程序:

unbuffer  | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; }'

它默认安装在大多数Linux系统上.如果你需要自己构建它,它是expect包的一部分

http://expect.nist.gov



8> 小智..:

使用read(1)命令从标准输入一次读取一行,然后使用date(1)以您选择的格式输出前面带有日期的行.

$ cat timestamp
#!/bin/sh
while read line
do
  echo `date` $line
done
$ cat somefile.txt | ./timestamp


有点重量级,因为它每行分配一个新进程,但它的工作原理!
推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有