是否有Unix实用程序将时间戳添加到stdin之前?
我最终使用Python为此编写了一个简短的小脚本,但是我想知道是否有一个实用程序可以将文本填充到每行的前面,在我的特定情况下是一个时间戳,我们可以在其中添加文本。理想情况下,用法将是这样的:
cat somefile.txt | prepend-timestamp
(在我们回答sed之前,我尝试过此操作:
cat somefile.txt | sed "s/^/`date`/"
但这只会在执行sed时对date命令进行一次评估,因此同一时间戳会错误地添加到每一行。)
解决方案
回答
这个怎么样?
cat somefile.txt | perl -pne 'print scalar(localtime()), " ";'
从我们希望获得实时时间戳的角度来看,也许我们想对日志文件或者其他内容进行实时更新?可能是
tail -f /path/to/log | perl -pne 'print scalar(localtime()), " ";' > /path/to/log-with-timestamps
回答
如果我们要添加的值在每一行都相同,请使用该文件启动emacs,然后:
Ctrl + <空格>
在文件的开头(以标记该位置),然后向下滚动到最后一行的开头(Alt +>将转到文件的末尾...这可能也涉及Shift键,然后按Ctrl + a转到该行的开头),然后:
Ctrl + x x r r t
这是要在我们刚刚指定的矩形(宽度为0的矩形)上插入的命令。
2008-8-21 6:45 PM <enter>
或者任何我们想添加的内容...然后,我们将看到该文本添加到0宽度矩形内的每一行。
更新:我只是意识到我们不希望使用相同的日期,因此这将无法工作...尽管我们可以使用稍微复杂一些的自定义宏在emacs中执行此操作,但是这种矩形编辑仍然很高兴知道...
回答
我不是Unix专家,但我认为我们可以使用
gawk '{print strftime("%d/%m/%y",systime())<command> | awk '{ print strftime("%Y-%m-%d %H:%M:%S"),}' < somefile.txtunbuffer <command> | awk '{ print strftime("%Y-%m-%d %H:%M:%S"),; fflush(); }'$ 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; }'
回答
可以尝试使用awk
:
$ cat timestamp #!/bin/sh while read line do echo `date` $line done $ cat somefile.txt | ./timestamp
我们可能需要确保<command>
产生行缓冲输出,即它在每一行之后刷新其输出流; " awk"添加的时间戳记是该行的结尾出现在其输入管道上的时间。
如果awk显示错误,请改用gawk
。
回答
Kieron的答案是迄今为止最好的答案。如果由于第一个程序正在缓冲它而遇到问题,则可以使用unbuffer程序:
#! /bin/sh unbuffer "$@" | perl -e ' use Time::HiRes (gettimeofday); while(<>) { ($s,$ms) = gettimeofday(); print $s . "." . $ms . " " . $_; }'
默认情况下,它已安装在大多数linux系统上。如果我们需要自己构建它,则它是Expect包的一部分
http://expect.nist.gov
回答
注释,可以通过该链接获得,也可以在Debiandevscripts
软件包中作为"注释输出"来使用。
回答
使用read(1)命令一次从标准输入中读取一行,然后使用date(1)以我们选择的格式输出以日期开头的行。
##代码##