我结束了写一个快速的小脚本,这在蟒蛇,但我想知道,如果有一个工具,你可以养活的文字变成这将在前面加上每个符合一些文字--在我的特定情况下,时间戳。理想的是,使用会喜欢的东西:

cat somefile.txt | prepend-timestamp

(在你回答之前sed,我试图这样的:

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

但是,只有评估的日期命令一旦当sed执行,所以同一时间戳是不正确地预先考虑到每个行。)

有帮助吗?

解决方案

可以尝试使用 awk:

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

你可能需要确保 <command> 生产线的缓冲输出的,即它刷新其后输出流的每一个线;时间戳 awk 添加了会的时间底线出现在其输入管。

如果awk示出了错误的,那么试试 gawk 代替。

其他提示

tsmoreutils 将在前面加上有时间戳到每一行输入你给它。你能格式化使用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

注释, 可以通过链接或者作为 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,他们来自的期待-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

只是要把这个扔出来的有:有一对中的公用事业 daemontoolstai64ntai64nlocal 这是由于前置时间戳记录的信息。

例如:

cat file | tai64n | tai64nlocal

基隆的回答是最好的一个为止。如果你有问题,因为第一个节目是缓冲地,你可以使用缓冲的程序:

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

这是默认情况下安装在大多数linux系统。如果你需要建设它自己的这一部分的期望包

http://expect.nist.gov

使用的阅读(1)命令以读一行的时间从标准的输入,随后输出的线的前面添加的日期格式的选择使用的日期(1)条。

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

我不是Unix人,但我认为您可以使用

gawk '{print strftime("%d/%m/%y",systime()) $0 }' < somefile.txt
#! /bin/sh
unbuffer "$@" | perl -e '
use Time::HiRes (gettimeofday);
while(<>) {
        ($s,$ms) = gettimeofday();
        print $s . "." . $ms . " " . $_;
}'

这是我的awk解决方案(从Windows XP系统与MKS工具已安装在C:\bin 目录)。它的目的是增加当前的日期和时间的形式毫米/dd hh:mm的各行开始具有获取,时间戳从该系统作为每个线阅读。你可以,当然,使用开始模式来获取时间戳一次,并补充说,时间戳到的每一记录(所有相同)。我没有这个标记一个日志文件,该文件正在产生stdout有时间戳在的时间的日志的信息的产生。

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

这里的"图"是一串或regex(没有报价)以匹配在输入线,而是可选的,如果你想要匹配的所有输入线。

这应该在Linux/UNIX系统以及刚刚摆脱C\:\\bin\\留下线

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

这当然,假定该命令"日期"得到你的标准的Linux/UNIX日期显示器/设定的命令没有具体的路径的信息(即,环境的道路变是正确配置).

混合一些答复从上面 natevw 和弗兰克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);
  '

备选版本,与冲洗并阅读,在一个循环:

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);
  }'
$ 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 有什么你需要的。

caerwyn的答案可以作为一个子程序,这将防止新流程的每一行:

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

echo testing 123 |timestamp

免责声明:解决我提议不是Unix建立在实用工具。

我面临一个类似的问题的前几天。我不喜欢的语法和限制的解决方案上面,所以我很快把一个程序去做的工作对我来说。

你可以检查的工具: preftime

有的预制执行for Linux,mac os,并在Windows 释放 部分审查的项目。

该工具处理不完全的输线和有(从我的角度来看)一个更紧凑的语法。

<command> | preftime

这不是理想的,但我虽然我们分享的情况下,它可以帮助别人。

datetrxargs 在OS x:

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 \"{}\"'"

但请注意,在OS x,日期不给你%N选择,所以你需要安装gdate(brew install coreutils)和所以最后达成这样的:

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

如果值加上为相同的每一线、火了emacs的文件,则:

Ctrl + <space>

在开始的文件(标记这一点),然后下滚开始的最后一线(Alt>会走到最后的文件...这可能会涉及转移的关键过,然后按Ctrl+一个去开始的那条线)并且:

Ctrl + x r t

这是命令插入在矩形刚刚指定(a rectangle0宽度)。

2008-8-21 6:45 <enter>

或任何你想要预先准备...然后你会看到文字的前面添加到每线内的0宽矩形。

更新:我只是意识到你不想同一日期,所以这不会的工作。虽然你可能能够这样做emacs的一个稍微更加复杂定义的宏观,但是,这种类型的矩形的编辑很高兴知道有关...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top