是否有Unix实用程序将时间戳添加到stdin之前?

时间:2020-03-05 18:41:51  来源:igfitidea点击:

我最终使用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"), 
unbuffer <command> | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), 
$ 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
; }'
; fflush(); }'
}' < somefile.txt

回答

可以尝试使用awk

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

我们可能需要确保&lt;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)以我们选择的格式输出以日期开头的行。

##代码##

回答

##代码##