如何过滤掉低于特定毫秒的任何 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] 返回给定列表的第一个元素(需要从列表切换到标量)