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

cat somefile.txt | prepend-timestamp

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

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

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

===============>>#1 票数:185 已采纳

可以尝试使用awk

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

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

如果awk显示错误,那么请尝试gawk

===============>>#2 票数:185

来自moreutils的 ts会在你给它的每一行输入前加一个时间戳。 您也可以使用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

===============>>#3 票数:45

注释 ,可通过该链接获得,或作为Debian devscripts包中的annotate-output提供。

$ 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 票数:31

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

unbuffer $COMMAND | ts

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

sudo apt-get install expect-dev moreutils

===============>>#5 票数:24

这个怎么样?

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

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

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

===============>>#6 票数:19

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

例:

cat file | tai64n | tai64nlocal

===============>>#7 票数:18

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

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

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

http://expect.nist.gov

===============>>#8 票数:9

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

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

===============>>#9 票数:3

我不是一个Unix人,但我认为你可以使用

gawk '{print strftime("%d/%m/%y",systime()) $0 }' < somefile.txt

===============>>#10 票数:3

#! /bin/sh
unbuffer "$@" | perl -e '
use Time::HiRes (gettimeofday);
while(<>) {
        ($s,$ms) = gettimeofday();
        print $s . "." . $ms . " " . $_;
}'

===============>>#11 票数:2

natevw和Frank Ch中混合上面的一些答案。 Eigler。

它有毫秒,比每次调用外部date命令都要好,并且在大多数服务器中都可以找到perl。

tail -f log | perl -pne '
  use Time::HiRes (gettimeofday);
  use POSIX qw(strftime);
  ($s,$ms) = gettimeofday();
  print strftime "%Y-%m-%dT%H:%M:%S+$ms ", gmtime($s);
  '

具有flush和循环读取的替代版本:

tail -f log | perl -pne '
  use Time::HiRes (gettimeofday); use POSIX qw(strftime);
  $|=1;
  while(<>) {
    ($s,$ms) = gettimeofday();
    print strftime "%Y-%m-%dT%H:%M:%S+$ms $_", gmtime($s);
  }'

===============>>#12 票数:2

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

你可以这样做(使用gnu / sed ):

$ some-command | sed "x;s/.*/date +%T/e;G;s/\n/ /g"

例:

$ { echo 'line1'; sleep 2; echo 'line2'; } | sed "x;s/.*/date +%T/e;G;s/\n/ /g"
20:24:22 line1
20:24:24 line2

当然,您可以使用程序日期的其他选项。 只需将date +%T替换为您需要的。

===============>>#13 票数:2

这是我的awk解决方案(来自安装在C:\\ bin目录中的MKS Tools的Windows / XP系统)。 它被设计为将当前日期和时间以mm / dd hh:mm的形式添加到每行的开头,并在读取每行时从系统获取该时间戳。 当然,您可以使用BEGIN模式获取一次时间戳并将该时间戳添加到每条记录(全部相同)。 我这样做是为了使用生成日志消息时的时间戳将生成的日志文件标记为stdout。

/"pattern"/ "C\\:\\\\\\\\bin\\\\\\\\date '+%m/%d %R'" | getline timestamp;
print timestamp, $0;

其中“pattern”是要在输入行中匹配的字符串或正则表达式(不带引号),如果您希望匹配所有输入行,则它是可选的。

这应该也适用于Linux / UNIX系统,只需删除离开该行的C \\:\\\\ bin \\\\

             "date '+%m/%d %R'" | getline timestamp;

当然,这假设命令“date”使您进入标准的Linux / UNIX date display / set命令,而没有特定的路径信息(即,您的环境PATH变量已正确配置)。

===============>>#14 票数:1

caerwyn的答案可以作为子程序运行,这将阻止每行的新进程:

timestamp(){
   while read line
      do
         echo `date` $line
      done
}

echo testing 123 |timestamp

===============>>#15 票数:1

免责声明 :我提议的解决方案不是Unix内置实用程序。

几天前我遇到了类似的问题。 我不喜欢上面解决方案的语法和限制,所以我很快就把Go中的一个程序放在一起为我做的工作。

你可以在这里查看工具: preftime

在GitHub项目的Releases部分中有针对Linux,MacOS和Windows的预构建可执行文件。

该工具处理不完整的输出行,并且(从我的角度来看)语法更紧凑。

<command> | preftime

这不是理想的,但我会分享它,以防它帮助某人。

===============>>#16 票数:0

在OSX上使用datetr以及xargs

alias predate="xargs -I{} sh -c 'date +\"%Y-%m-%d %H:%M:%S\" | tr \"\n\" \" \"; echo \"{}\"'"
<command> | predate

如果你想要毫秒:

alias predate="xargs -I{} sh -c 'date +\"%Y-%m-%d %H:%M:%S.%3N\" | tr \"\n\" \" \"; echo \"{}\"'"

但请注意,在OSX上,date并没有给你%N选项,所以你需要安装gdate( brew install coreutils ),所以最后到达:

alias predate="xargs -I{} sh -c 'gdate +\"%Y-%m-%d %H:%M:%S.%3N\" | tr \"\n\" \" \"; echo \"{}\"'"

===============>>#17 票数:-1

如果您在前面添加的值在每一行都相同,则使用该文件启动emacs,然后:

Ctrl + <space>

在文件的开头(标记该点),然后向下滚动到最后一行的开头(Alt +>将转到文件的末尾...这可能也会涉及Shift键,然后按Ctrl键+ a去那行的开头)和:

Ctrl + x r t

这是在您刚刚指定的矩形中插入的命令(0宽度的矩形)。

2008-8-21 6:45 PM <enter>

或者无论你想要什么...然后你会看到文本前置于0宽度矩形内的每一行。

更新:我刚刚意识到你不想要相同的日期,所以这不会起作用......虽然你可以在稍微复杂的自定义宏的emacs中做到这一点,但是,这种矩形编辑仍然是很高兴知道...

  ask by Joe Shaw translate from so

未解决问题?本站智能推荐:

7回复

哪个Unix实用程序可以帮助我从文件中的一行中提取特定字符

我有一个包含以下数据的文件f1: 我想从中提取开括号后的前4个字符。 能否请您告诉一下unix实用程序/ shell命令可以执行哪些操作。 说:
5回复

如何使用Linux / Unix实用程序在每个输入行的开头提取整数或十进制?

给定输入,例如: 如何仅使用Linux / Unix命令行实用程序提取每条输入行开头的整数/小数?
2回复

如何通过unix shell将日期转换为多行的时间戳

我已经grep埃德日期字符串的多日志文件: 现在,我想将它们转换为时间戳,并找出哪个大于一个值 日期cmd: 我不确定如何使用多行,awk或其他shell cmd来执行此操作。
2回复

在UNIX脚本中将日期时间戳问题附加到文件名

我有一堆由遗留系统生成的文件,要求将文件重命名为长描述(企业用户可以理解的东西)。 示例文件名: bususrapp.O16200.L1686.1201201304590298 RptList: bususrapp Billing file for app user 当系统生成
2回复

如何检查输入的日期是否与几个文本文件的时间戳相匹配

使用bash输入我的年月日,需要检查文本文件是否包含该特定日期,如果需要,则需要返回文本文件名。 例如: 如果我的输入与时间戳匹配,则需要打印出文件名。 如何使用bash匹配时间戳?
2回复

我如何从名称以TRAN开头,后跟日期时间戳的shell脚本中rm文件

我需要从shell脚本中删除一个文件,该文件的名称以TRAN开头,后跟日期时间戳。 给我命令行上的文件名。 但是,我似乎无法将其存储在变量中。 执行时: 第32行的语法错误:“名称= $”意外 请指教
4回复

如何在unix中每行的末尾添加文本

我正在进行某些文本处理操作,最终能够获得这样的文件 现在我想在上面的文件中添加注释,就像在最终文件中它应该是类似的 像整个文件中的相同评论。 我该怎么做呢?
1回复

Unix Shell命令用于正常运行时间监视

抱歉,我不是Unix专家,Windows和Powershell更适合我。 我需要使用可以从SCOM调用的shell命令来检查Linux服务器上的正常运行时间。 我已经能够使用...在几秒钟内将正常运行时间恢复为SCOM。 但是,SCOM不会将其视为数字,我认为它会将返回的输出视为
2回复

将文件中的所有Unix时间转换为人工日期

我想将JSON数据文件中的所有UNIX时间替换为相同的UNIX时间,然后替换为人类可读的日期格式。 例如,我要用“ 1234567890123456,2009-02-14,00:31:30,sat”替换“ 1234567890123456”(以微秒为单位的时间)。 我尝试过
2回复

如何在Unix Shell脚本中将当前时间与两个不同的时间以及dayofweek进行比较?

如何比较两个时间戳以及另一个条件。 请找到以下代码作为变通方法的试用版。 您能帮我这个忙吗,非常感谢!