僅輸出“長 ping”/記錄連接中斷

僅輸出“長 ping”/記錄連接中斷

我的連線有時會中斷一段時間,我試圖準確地確定何時使用ping,它會產生以下輸出:

64 bytes from 192.168.0.1: icmp_req=1196 ttl=64 time=4.64 ms
64 bytes from 192.168.0.1: icmp_req=1197 ttl=64 time=5.14 ms
64 bytes from 192.168.0.1: icmp_req=1198 ttl=64 time=4.90 ms
64 bytes from 192.168.0.1: icmp_req=1199 ttl=64 time=25293 ms < -- interruption
64 bytes from 192.168.0.1: icmp_req=1200 ttl=64 time=24286 ms      starts here
64 bytes from 192.168.0.1: icmp_req=1201 ttl=64 time=23278 ms
64 bytes from 192.168.0.1: icmp_req=1202 ttl=64 time=22270 ms
64 bytes from 192.168.0.1: icmp_req=1203 ttl=64 time=21262 ms
64 bytes from 192.168.0.1: icmp_req=1204 ttl=64 time=20254 ms
64 bytes from 192.168.0.1: icmp_req=1224 ttl=64 time=142 ms
64 bytes from 192.168.0.1: icmp_req=1225 ttl=64 time=4.87 ms
64 bytes from 192.168.0.1: icmp_req=1226 ttl=64 time=4.54 ms

我怎麼能夠?

  • 僅輸出那些帶有大time.可以grep做到?
  • 為它們添加時間戳(我知道 的選項-Dping但我更喜歡人類可讀的時間戳)

答案1

grepawk(從這個問題中剝離出來,也許有點矯枉過正,但它有效)

ping 192.168.0.1 \
| grep -E "time=[0-9]{2}" --line-buffered \
| gawk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; fflush(); }'

答案2

說到過度解決方案,如果您仍然想要第一個問題的答案(僅獲取時間大於 X 的行),請嘗試以下醜陋的 bash-python 混合腳本:

#!/bin/bash

IFS='\n' read -r -d '' check_ping <<EOF
from sys import stdin
data = reduce(lambda x, y: str(x) + str(y), stdin.readlines())
time = int(float(data.split("time=")[-1].split(" ")[0].strip()))
if time > $2: print(data)
EOF

ping -c 1 $1 | python -c "${check_ping}"

如果將其放入腳本檔案(例如 )中test.sh,則可以向其傳遞兩個參數:要 ping 的主機名稱和最小 TTL,低於該值不應回顯 ping 輸出。例如,如果您執行tst.sh www.google.com 100它,只會返回花費超過 100 毫秒的 ping 到 www.google.com。

答案3

我不喜歡為這種事情處理文本的想法,儘管這是 unix-y 要做的事情。您可以查看 perl 和 Net::Ping。使用它,您可以定義自己的超時,並且僅在 ping 失敗時才採取操作。更多這裡:

http://perldoc.perl.org/Net/Ping.html

相關內容