2014-01-13 70 views
18

我有一个程序(服务器),我正在寻找一种方式(脚本),将重定向(或更好地复制)其所有stdout文件并为每个条目添加时间戳。我已经做了一些研究,最远的地方是得到How to add timestamp to STDERR redirection。它重定向stdout倒是时间戳的时候脚本完成:Bash - 如何添加时间戳,同时重定向stdout文件

代码
#!/bin/bash 
./server | ./predate.sh > log.txt 

predate.sh

#!/bin/bash 
while read line ; do 
    echo "$(date): ${line}" 
done 

我是一个Linux初学者,我显然失去了一些东西很重要,因为它似乎服务器输出在程序退出后被刷新(不重定向就可以正常工作)。另外,如果我尝试使用predate.sh对提到的线程给出的例子,它完美的作品。我知道将时间戳添加到主程序很容易,但我宁愿避免编辑它的代码。

编辑:唯一的工作答案都在评论

+2

所以问题是,所有的时间戳是相同的,当脚本结束的时候?听起来像这是'服务器'输出没有正确缓冲的问题。 http://stackoverflow.com/questions/3465619/how-to-make-output-of-any-shell-command-unbuffered可能是你在找什么 – Graeme

+0

输出到_awk_。它提供了一个叫做_strftime_的函数。 – devnull

+1

'expect'发行版带有一个名为['unbuffer']的程序(http://linuxcommand.org/man_pages/unbuffer1.html):'unbuffer ./server | ./predate.sh> log.txt' –

回答

-1

如果我理解你的问题是已经包含在你的log.txt文件stderr输出。对 ? 如果这就是你想要的解决方案是:

./server 2> & 1 | ./predate.sh> log.txt的

问候

+2

nope,它只是时间都是一样的 – wondra

+0

也许你的服务器执行得太快......尝试打印纳秒如下并检查差异:echo“$(date +%T.%N):$ {line} “ – HelpBox

+0

我有关闭服务器的功能,需要25秒,相信我 - 我会注意到... – wondra

4

你对我的代码工作完全正常

入住这就是我试图

test.sh

#!/bin/bash 

while true; do 
    echo "hello" 
done 

predate.sh

#!/bin/bash 

while read line; do 
    echo $(date) ":" $line;  
done 

然后

./test.sh | ./predate.sh 

给我

Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 

这可以被重定向到使用一些文件 “>” 或 “>>” 进行追加

Check Snapshot

+1

如果您仔细阅读我的问题 - 这有效。脚本标准输出给我,但程序标准没有(奇怪)。我需要程序的标准输出。这个问题比较复杂,然后简单地重定向输出 - 程序输出结束后立即被激活。 – wondra

+0

格式化丢失:我努力得到正确的格式,并以此函数结束(function preate(){tr“\ n”“\ 0”| xargs -0 -I {} echo“$(date):{}”; }(注意这仍然不能回答这个问题)。 –

34

我最近需要准确即:在串行控制台(picocom)中接收日志消息,将它们打印到终端和文件并预先输入日期。

我现在使用看起来s.th.像这样:

picocom -b 115200 /dev/tty.usbserial-1a122C | awk '{ print strftime("%s: "), $0; fflush(); }' | tee serial.txt 
  • picocom输出被管道输送到awk
  • awk预先考虑日期(%s选项转换自1970-01-01 00:00的时间的秒数量: 00 UTC - 或使用%c为人类可读的格式)
  • fflush()flushes any buffered outputawk
  • 管道到tee将其转移到文件。 (你可以找到一些东西约teehere
+8

非常感谢您的支持。我想向使用此功能的任何人添加打印类似“2015-11-13 17:04:57:”的时间戳,格式为“%Y-%m-%d%H:%M:%S: ”。 – lm2s

+1

Awk,永远的救援。 – macetw

+1

这是我唯一的输出:'awk:line 2:函数strftime永远不会定义# – ygoe

-2

我运行一个cron作业是这样的:

0 * * * * user /home/user/script.sh >>stdout.log 

然后在script.sh,我有这样的事情:

#!/bin/bash 
date 
do_some_code 

由于“date”是我的script.sh的stdout的一部分,所以timestamp是每个stdout.log条目中的第一行。

+2

这是最恰当的切线,并没有回答这个问题。如果你有一个长期运行的工作,你经常想看看什么时候打印了一条特定的消息。 – tripleee

+0

如果您从脚本/程序重定向,则无法更改。 – srigi

-1

我在使用上面的例子: picocom -b 115200 /dev/tty.usbserial-1a122C | awk'{print strftime(“%s:”),$ 0; fflush(); }'| tee serial.txt

转储/重定向日志文件中的telnet输出数据,但我无法在后台运行我的脚本。如果我使用'&'来运行它的背景,那么它不起作用。

要点#1:没有'&'的工作命令: script:dumpper.sh telnet $ 1 $ 2 | awk'{print strftime(“%s:”),$ 0;}'| tee $ host。$ port.log;

命令:./dumpper.sh 16.1.1.8 202

点#1:不工作的命令与 '&': 脚本:dumpper.sh 的telnet $ 1 $ 2 | awk'{print strftime(“%s:”),$ 0;}'| tee $ host。$ port.log 2> & 1;

命令:./dumpper.sh 16.1.1.8 20224 &

+0

请解释我如何在后台运行telnet并在日志文件中记录telnet输出。我不想打扰telnet提示。 – vicky