如何给流式传输到标准输出的UNIX命令的每一行加上时间戳?

如何给流式传输到标准输出的UNIX命令的每一行加上时间戳?,unix,command-line,stdout,unix-timestamp,Unix,Command Line,Stdout,Unix Timestamp,假设我想给一个命令加上时间戳,比如ping google.com,这样输出看起来像 [9:48:56]PING google.com (116.28.94.14): 56 data bytes [9:48:55]64 bytes from 116.28.94.14: icmp_seq=0 ttl=54 time=13.118 ms [9:48:57]64 bytes from 116.28.94.14: icmp_seq=1 ttl=54 time=13.943 ms [9:48:58]64 b

假设我想给一个命令加上时间戳,比如
ping google.com
,这样输出看起来像

[9:48:56]PING google.com (116.28.94.14): 56 data bytes
[9:48:55]64 bytes from 116.28.94.14: icmp_seq=0 ttl=54 time=13.118 ms
[9:48:57]64 bytes from 116.28.94.14: icmp_seq=1 ttl=54 time=13.943 ms
[9:48:58]64 bytes from 116.28.94.14: icmp_seq=2 ttl=54 time=19.103 ms
[9:48:59]64 bytes from 116.28.94.14: icmp_seq=3 ttl=54 time=12.854 ms

我研究过使用管道和命令的奇特方法,如
xarg
awk
,但我就是做不好。另外,让我们假设我的环境不允许我使用像
stdbuff
unbuff
这样的花哨东西。如果可能的话,用最像unix的方法实现这一点将是非常棒的。谢谢大家!

以下是最简单、最愚蠢的方法:

$ while read -r line ; do echo "$(date "+%H:%M:%S"): $line" ; done < <(while true ; do echo foo ; sleep 1 ; done)
00:07:08: foo
00:07:09: foo
00:07:10: foo
00:07:11: foo
00:07:12: foo

$whileread-r行;是否回显“$(日期“+%H:%M:%S”):$line”;完成<以下是最简单、最愚蠢的方法:

$ while read -r line ; do echo "$(date "+%H:%M:%S"): $line" ; done < <(while true ; do echo foo ; sleep 1 ; done)
00:07:08: foo
00:07:09: foo
00:07:10: foo
00:07:11: foo
00:07:12: foo

$whileread-r行;是否回显“$(日期“+%H:%M:%S”):$line”;完成<1中的
ts
命令(用于“timestamp”)正是为此而生成的。要向
ping
输出中添加时间戳,请使用

ping google.com | ts '[%H:%M:%S]'
我不知道这是否属于“使用管道的奇特方式”,但我要说的是,这是一种很好的unix方式,因为您使用的是一种可以


1您可以在Debian/Ubuntu中安装moreutils,例如,使用
sudo apt get install moreutils

1中的
ts
命令(用于“timestamp”)正是为此而生成的。要向
ping
输出中添加时间戳,请使用

ping google.com | ts '[%H:%M:%S]'
我不知道这是否属于“使用管道的奇特方式”,但我要说的是,这是一种很好的unix方式,因为您使用的是一种可以


1您可以在Debian/Ubuntu中安装moreutils,例如,使用
sudo apt get install moreutils

manping
说有一个选项
-D
。。检查它的帮助您没有使用管道和
awk
的“奇特方式”是什么?我通常对perl-ne'printf[%s]:%s”、scalar(localtime)非常满意,$\code>
manping
说有一个选项
-D
。。检查它的帮助您没有使用管道和
awk
的“奇特方式”是什么?我通常对
perl-ne'printf][%s]:%s”、scalar(localtime)、$\code>非常满意。您可以将
$行
走私到
日期
格式字符串中;只要通过加倍来避开任何百分比符号
date+%T:${line//%/%%}“
您可以将
$line
走私到
date
格式字符串中;只要通过加倍来避开任何百分比符号<代码>日期+%T:${line//%%/%%}“