仅输出“长 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做到吗?
  • 为它们添加时间戳(我知道这个-D选项ping,但我更喜欢人类可读的时间戳)

答案1

grep使用和计算出该解决方案awk从这个问题中摘录,也许有点过头了,但确实有效)

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,低于该 TTL 时它不应回显 ping 输出。例如,如果您运行tst.sh www.google.com 100它,它将仅返回耗时超过 100 毫秒的 www.google.com ping。

答案3

我不喜欢处理这种文本的想法,尽管这是 unix 应该做的事情。您可以查看 perl & Net::Ping。使用它,您可以定义自己的超时时间,并且仅在 ping 失败时才采取行动。更多信息请见:

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

相关内容