bash - ping timestamp




如何為每個ping結果添加時間戳? (10)

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。


  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 &


你沒有指定任何時間戳或間隔你需要多長時間輸出,所以我認為它是一個無限循環。 您可以根據需要進行相應更改。

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

在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

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

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所需的格式。


您可以在~/.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:來自93.184.216.34(93.184.216.34)的64字節: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


我還需要這個來監控我的數據庫鏡像超時問題的網絡問題。 我使用命令代碼如下:

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/


由於某種原因,我無法將基於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


試試這個:

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

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




bsd