如何按时间过滤 ping 结果?

如何按时间过滤 ping 结果?

如何过滤掉低于特定毫秒的任何 ping,即仅将超过 500 毫秒的 ping 响应回显到文本文件?

IP=$1
SECONDS_Between_Pings=$2

ping -i $2 $1 | while read pong; do echo $(date) $pong; done >> ~/Downloads/pings_file_$(date +%Y-%m-%d).txt

答案1

grep使用扩展正则表达式:

ping ... | grep --line-buffered -E 'time=([0-9]{4}|[5-9][0-9]{2})' | ...

这将匹配任何紧随time=其后的行:

  • 任意 4 位数字(1000+ 毫秒)。
  • 一位数字 5-9 后跟任意 2 位数字 (500-999 ms)。

--line-buffered周围工作grep默认输出缓冲引起的问题在管道链中使用时。当 grep 是管道链中的最后一个链接时不需要。

答案2

Perl解决方案:

ping -i "$2" "$1" | while read pong; do echo $(date) "$pong" ; done \
  | perl -ne 'print if (/time=([0-9.]+)/)[0] > .5' >> ~/Downloads/...

解释: -([0-9.]+)匹配后面的十进制数time=并记住它 - (...)[0] 返回给定列表的第一个元素(需要从列表切换到标量)

相关内容