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

时间:2012-05-21 05:17:03

标签: bash osx-lion ping bsd

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)上,似乎有一些BSD版本的ping。

16 个答案:

答案 0 :(得分:87)

由于某些原因,我无法将基于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 :(得分:77)

如果你的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

答案 2 :(得分:26)

来自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转换为所需的格式。

答案 3 :(得分:13)

  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 &

答案 4 :(得分: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一次处理一行而不是单词。

答案 5 :(得分:5)

在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

答案 6 :(得分:4)

试试这个:

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

答案 7 :(得分:3)

将结果传递给awk

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

答案 8 :(得分:3)

在macos上你可以做到

Route::current()->parameter('username');

输出看起来像

ping --apple-time 127.0.0.1

答案 9 :(得分:1)

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

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

答案 10 :(得分: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

答案 11 :(得分: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/

答案 12 :(得分:1)

更简单的选择是使用 moreutils 中的 ts(1)(在大多数发行版中是相当标准的)。

$ ping 1.1.1.1 | ts 

Feb 13 12:49:17 PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data. 
Feb 13 12:49:17 64 bytes from 1.1.1.1: icmp_seq=1 ttl=57 time=5.92 ms
Feb 13 12:49:18 64 bytes from 1.1.1.1: icmp_seq=2 ttl=57 time=5.30 ms
Feb 13 12:49:19 64 bytes from 1.1.1.1: icmp_seq=3 ttl=57 time=5.71 ms
Feb 13 12:49:20 64 bytes from 1.1.1.1: icmp_seq=4 ttl=57 time=5.86 ms

 ping 1.1.1.1 -I eth0 | ts "[%FT%X]"

允许使用与 shell/date 解决方法相同的 strftime 格式字符串。

答案 13 :(得分:0)

试试这一行。

TableGrob (11 x 21) "layout": 42 grobs
    z         cells       name                                    grob
28  2 ( 6- 6, 4- 4)  strip-t-1                           gtable[strip]
29  2 ( 6- 6, 6- 6)  strip-t-2                           gtable[strip]
30  2 ( 6- 6, 8- 8)  strip-t-3                           gtable[strip]
31  2 ( 6- 6,10-10)  strip-t-4                           gtable[strip]
32  2 ( 6- 6,12-12)  strip-t-5                           gtable[strip]
33  2 ( 6- 6,14-14)  strip-t-6                           gtable[strip]
34  2 ( 6- 6,16-16)  strip-t-7                           gtable[strip]
35  2 ( 6- 6,18-18)  strip-t-8                           gtable[strip]

您必须使用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 tho。

取消它

答案 14 :(得分:0)

您可以在~/.bashrc文件中创建一个函数,这样您就可以在控制台上获得ping命令ping-t

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

现在你可以在控制台上调用它:

ping-t example.com
  

Sa31.Mär12:58:31 CEST 2018:PING example.com(93.184.216.34)56(84)字节数据。
  Sa31.Mär12:58:31 CEST 2018:64字节来自93.184.216.34(93.184.216.34):icmp_seq = 1 ttl = 48 time = 208 ms
  Sa31.Mär12:58:32 CEST 2018:64字节来自93.184.216.34(93.184.216.34):icmp_seq = 2 ttl = 48 time = 233 ms

答案 15 :(得分:0)

只需使用 sed:

ping google.com|sed -r "s/(.*)/$(date) \1/g"