如何为每个ping结果加时间戳?


77

Ping默认返回以下内容:

64 bytes from 203.173.50.132: icmp_seq=0 ttl=244 time=57.746 ms

有什么办法可以添加时间戳吗?

例如,

Mon 21 May 2012 15:15:37 EST | 64 bytes from 203.173.50.132: icmp_seq=0 ttl=244 time=57.746 ms

我在OS X v10.7(Lion)上,它似乎具有ping的某些BSD版本。

Answers:


121

由于某种原因,我无法将基于Perl的解决方案重定向到文件,因此我不断搜索并找到了bash执行此操作的唯一方法:

ping www.google.fr | while read pong; do echo "$(date): $pong"; done

Wed Jun 26 13:09:23 CEST 2013: PING www.google.fr (173.194.40.56) 56(84) bytes of data.
Wed Jun 26 13:09:23 CEST 2013: 64 bytes from zrh04s05-in-f24.1e100.net (173.194.40.56): icmp_req=1 ttl=57 time=7.26 ms
Wed Jun 26 13:09:24 CEST 2013: 64 bytes from zrh04s05-in-f24.1e100.net (173.194.40.56): icmp_req=2 ttl=57 time=8.14 ms

信用转到https://askubuntu.com/a/137246


1
这似乎不适用于debian wheezy。就停在那儿不输出,直到CTRL + C
KBeezie

1
@KBeezie不确定您遇到的问题是什么。我刚刚在debian wheezy上尝试过,效果很好。您是否正在使用bash外壳?
里奇,

7
我实际上更喜欢这种方法,因为它不使用perl或awk。
Alexey Kamenskiy

3
要查看超时,所需要做的就是重定向stderrstdout管道(|)之前的位置,如下所示:ping $host 2>&1 | while read pong; do echo "$(date): $pong"; done。如果您希望将其写入(或追加)到文件中,则可以重定向整个命令(完成后)。另外,如果您不希望生成子shell,则该date命令支持echoing任意输入,例如:ping $host 2>&1 | while read pong; do date "+%c: $pong"; done。请注意format的参数date(即打头+)可以随意定制。请参阅man date以获取更多信息。
7heo.tk

FWIW,我的默认外壳是ZSH,它无法正常工作。当我在Bash中运行它时,它运行良好。OP在他的评论的第一段中确实提到了这一点... :)
Levi Figueira,

78

如果您的AWK没有strftime()

ping host | perl -nle 'print scalar(localtime), " ", $_'

要将其重定向到文件,请使用标准的shell重定向并关闭输出缓冲:

ping host | perl -nle 'BEGIN {$|++} print scalar(localtime), " ", $_' > outputfile

如果您想要ISO8601格式的时间戳记:

ping host | perl -nle 'use Time::Piece; BEGIN {$|++} print localtime->datetime, " ", $_' > outputfile

尽管我删除了'bytes from'过滤器,因为我想要每行的时间戳...尤其是超时。
约翰·米

效果很好,但是当您按Control + C时,它会在最后抑制汇总结果的STDERR。BASH答案存在相同的问题。
Nicholas Blasgen 2014年

1
@NicholasBlasgen:这是因为Ctrl-C转到管道中的最后一个进程,并且ping仅接收到SIGPIPE。您可以使用进程替换代替管道:ping host > >(perl -nle 'print scalar(localtime), " ", $_')Ctrl-C可以ping执行您想要的操作。您可以对while循环执行相同的操作。顺便说一句,在我的系统上,摘要转到STDOUT而不是STDERR(因此也加上了时间戳)。
暂停,直到另行通知。

恕我直言,如果日期时间格式为ISO8601,则此答案会更好。
Phrogz

@Phrogz:我同意这是一种更理想的格式,但是我的回答接近匹配OP要求的内容(取决于语言环境)。要获取ISO8601格式,您可以use Time::Piece; print localtime->datetime(和其他适当的设置)从5.10开始或使用CPAN模块或strftime
暂停,直到另行通知。

30

来自man ping

   -D     Print timestamp (unix time + microseconds as in gettimeofday) before each line.

它将产生如下内容:

[1337577886.346622] 64 bytes from 4.2.2.2: icmp_req=1 ttl=243 time=47.1 ms

然后可以从ping响应中解析出时间戳,并使用将其转换为所需的格式date


2
抱歉。当我添加标签时,adsl退出了……它是OSX Lion-没有“ -D”选项:-(
John Mee 2012年

擅长使用p​​erl和regex的人可以将其格式化为人类可读的日期时间=]
Cleber Reizen

15
  1. 终端输出:

    ping -i 5 google.com | xargs -L 1 -I '{}' date '+%Y-%m-%d %H:%M:%S: {}'

  2. 文件输出:

    ping -i 5 google.com | xargs -L 1 -I '{}' date '+%Y-%m-%d %H:%M:%S: {}' > test.txt

  3. 终端+文件输出:

    ping -i 5 google.com | xargs -L 1 -I '{}' date '+%Y-%m-%d %H:%M:%S: {}' | tee test.txt

  4. 文件输出背景:

    nohup ping -i 5 google.com | xargs -L 1 -I '{}' date '+%Y-%m-%d %H:%M:%S: {}' > test.txt &


10

在OS X上,您可以简单地使用--apple-time选项:

ping -i 2 --apple-time www.apple.com

产生如下结果:

10:09:55.691216 64 bytes from 72.246.225.209: icmp_seq=0 ttl=60 time=34.388 ms
10:09:57.687282 64 bytes from 72.246.225.209: icmp_seq=1 ttl=60 time=25.319 ms
10:09:59.729998 64 bytes from 72.246.225.209: icmp_seq=2 ttl=60 time=64.097 ms

8

我的原始提交内容不正确,因为它没有评估每一行的日期。已更正。

试试这个

 ping google.com | xargs -L 1 -I '{}' date '+%+: {}'

产生以下输出

Thu Aug 15 10:13:59 PDT 2013: PING google.com (74.125.239.103): 56 data bytes
Thu Aug 15 10:13:59 PDT 2013: 64 bytes from 74.125.239.103: icmp_seq=0 ttl=55 time=14.983 ms
Thu Aug 15 10:14:00 PDT 2013: 64 bytes from 74.125.239.103: icmp_seq=1 ttl=55 time=17.340 ms
Thu Aug 15 10:14:01 PDT 2013: 64 bytes from 74.125.239.103: icmp_seq=2 ttl=55 time=15.898 ms
Thu Aug 15 10:14:02 PDT 2013: 64 bytes from 74.125.239.103: icmp_seq=3 ttl=55 time=15.720 ms
Thu Aug 15 10:14:03 PDT 2013: 64 bytes from 74.125.239.103: icmp_seq=4 ttl=55 time=16.899 ms
Thu Aug 15 10:14:04 PDT 2013: 64 bytes from 74.125.239.103: icmp_seq=5 ttl=55 time=16.242 ms
Thu Aug 15 10:14:05 PDT 2013: 64 bytes from 74.125.239.103: icmp_seq=6 ttl=55 time=16.574 ms

-L 1选项使xargs一次处理一行而不是单词。


在“请求超时”期间不打印;将它们全部保存起来,并在请求超时停止时以相同的时间戳进行转储。
David Eison 2014年

@DavidEison尝试ping -D -n -O -i1 -W1 8.8.8.8
Thomas Szteliga 2015年

5

试试这个:

ping www.google.com | while read endlooop; do echo "$(date): $endlooop"; done

它返回类似:

Wednesday 18 January  09:29:20 AEDT 2017: PING www.google.com (216.58.199.36) 56(84) bytes of data.
Wednesday 18 January  09:29:20 AEDT 2017: 64 bytes from syd09s12-in-f36.1e100.net (216.58.199.36): icmp_seq=1 ttl=57 time=2.86 ms
Wednesday 18 January  09:29:21 AEDT 2017: 64 bytes from syd09s12-in-f36.1e100.net (216.58.199.36): icmp_seq=2 ttl=57 time=2.64 ms
Wednesday 18 January  09:29:22 AEDT 2017: 64 bytes from syd09s12-in-f36.1e100.net (216.58.199.36): icmp_seq=3 ttl=57 time=2.76 ms
Wednesday 18 January  09:29:23 AEDT 2017: 64 bytes from syd09s12-in-f36.1e100.net (216.58.199.36): icmp_seq=4 ttl=57 time=1.87 ms
Wednesday 18 January  09:29:24 AEDT 2017: 64 bytes from syd09s12-in-f36.1e100.net (216.58.199.36): icmp_seq=5 ttl=57 time=2.45 ms

5

在MacOS上您可以做

ping --apple-time 127.0.0.1

输出看起来像

16:07:11.315419 64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.064 ms
16:07:12.319933 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.157 ms
16:07:13.322766 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.066 ms
16:07:14.324649 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.148 ms
16:07:15.328743 64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.092 ms

3

将结果通过管道传递给awk

 ping host | awk '{if($0 ~ /bytes from/){print strftime()"|"$0}else print}'

有前途!我不喜欢strftime,所以我正在研究
John Mee

在不存在的主机上检查此代码,或者当网络
断开

1

您没有指定任何时间戳或间隔来指定需要多长时间输出,因此我认为这是一个无限循环。您可以根据需要进行相应更改。

while true
do
   echo -e "`date`|`ping -n -c 1 <IP_TO_PING>|grep 'bytes from'`"
   sleep 2
done

您应该将grep零件更改为`egrep '(bytes from|errors)'
rubo77

@ rubo77你能否解释为什么,而不是使用“grep”可以“egrep的”
Venkat马达夫

egrep只添加一个正则表达式以获取错误输出
rubo77

1
ping -D -n -O -i1 -W1 8.8.8.8

或许

while true; do \
    ping -n -w1 -W1 -c1 8.8.8.8 \
    | grep -E "rtt|100%" \
    | sed -e "s/^/`date` /g"; \
    sleep 1; \
done

1

我还需要它来监视网络问题,以解决数据库镜像超时问题。我使用以下命令代码:

ping -t Google.com|cmd /q /v /c "(pause&pause)>nul & for /l %a in () do (set /p "data=" && echo(!date! !time! !data!)&ping -n 2 Google.com>nul" >C:\pingtest.txt

您只需将Google.com修改为您的服务器名称。它非常适合我。并记得完成后停止此操作。pingtest.txt文件将每秒增加1 KB(大约)。

感谢raymond.cc。https://www.raymond.cc/blog/timestamp-ping-with-hrping/


更新:pingtest.txt文件每分钟将增加4.5 KB(大约)。
DBALUKE HUANG

0

尝试这一行。

while sleep 1;do echo "$(date +%d-%m-%y-%T) $(ping -c 1 whatever.com | gawk 'FNR==2{print "Response from:",$4,$8}')" | tee -a /yourfolder/pingtest.log;done

您必须使用ctrl-ctho取消它。


使用的一个好主意tee,但问题-c 1是失去了总体统计数据……
minusf '18

0

您可以在~/.bashrc文件中创建一个函数,以便ping-t在控制台上收到ping命令:

function ping-t { ping "$1" | while read pong; do echo "$(date): $pong"; done; }

现在,您可以在控制台上调用此命令:

ping-t example.com

Sa 31.2018年CEST 12:58:31 CEST:PING example.com(93.184.216.34)56(84)个字节的数据。
Sa31.Mär12:58:31 CEST 2018:来自93.184.216.34(93.184.216.34)的64个字节:icmp_seq = 1 ttl = 48 time = 208 ms
Sa31.Mär12:58:32 CEST 2018:来自93.184的64个字节.216.34(93.184.216.34):icmp_seq = 2 ttl = 48时间= 233毫秒

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.