我所处的连接有时会中断一段时间,我试图确定何时使用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 失败时才采取行动。更多信息请见: