题
我结束了写一个快速的小脚本,这在蟒蛇,但我想知道,如果有一个工具,你可以养活的文字变成这将在前面加上每个符合一些文字--在我的特定情况下,时间戳。理想的是,使用会喜欢的东西:
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
代替。
其他提示
ts
从 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
注释, 可以通过链接或者作为 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
只是要把这个扔出来的有:有一对中的公用事业 daemontools 叫 tai64n 和 tai64nlocal 这是由于前置时间戳记录的信息。
例如:
cat file | tai64n | tai64nlocal
基隆的回答是最好的一个为止。如果你有问题,因为第一个节目是缓冲地,你可以使用缓冲的程序:
unbuffer <command> | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; }'
这是默认情况下安装在大多数linux系统。如果你需要建设它自己的这一部分的期望包
使用的阅读(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
做 date
和 tr
和 xargs
在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的一个稍微更加复杂定义的宏观,但是,这种类型的矩形的编辑很高兴知道有关...