使用Python解析ping命令输出

3

您如何解析类似于以下内容的“ping”输出:

root@m2m-probe1:~/M2M/src# ping -c 20 -q google.es
PING google.es (173.194.34.247) 56(84) bytes of data.

--- google.es ping statistics ---
20 packets transmitted, 20 received, 0% packet loss, time 19043ms
rtt min/avg/max/mdev = 314.766/381.299/430.826/36.513 ms

使用Python进行数据分析?目前我找到的最好的方式是:
output = subprocess.check_output('ping ' + host + " -c 5 -q  | egrep \"packet loss|rtt\"", shell=True)

match = re.search('([\d]*\.[\d]*)/([\d]*\.[\d]*)/([\d]*\.[\d]*)/([\d]*\.[\d]*)', output)

ping_min = match.group(1)
ping_avg = match.group(2)
ping_max = match.group(3)

match = re.search('(\d*)% packet loss', output)
pkt_loss = match.group(1)

它可以工作,但我知道这远非实现它的最佳方式。有什么建议吗?

提前感谢!


可能是[在Python中ping一个网站的重复问题?]的副本 (https://dev59.com/UHRC5IYBdhLWcg3wYP6h) - Inbar Rose
实际上,这个问题的真正目的是学习如何在Python中使用正则表达式...在接下来的几周里,我将会大量使用它们。我正在寻找一个单一的正则表达式来匹配这两行,即数据包丢失和最小/平均/最大/抖动值。感谢您的建议! - Ignacio Verona
2个回答

3

已经有一个纯Python模块https://github.com/gg/pingparser可以完成这个功能,但是如果你想出于教学目的实现它,使用pyparsing库。与正则表达式相比,它更适合解析数据。


我在询问之前找到了pingparser,但它不支持数据包丢失,而这对我来说是一个重要的领域。我将尝试修改pingparser以支持它。 - Ignacio Verona
1
我已尝试过 Ping 解析器,但它在 Mac OS X ping 格式上出错了。我没有看到任何明显的代码错误... - Benjamin Schollnick

1

我不太喜欢正则表达式,可能是因为我没有经常使用它……

output = subprocess.check_output('ping -c %s -W %s -t %s 8.8.8.8' % (self.numPings, (self.pingTimeout * 1000), self.maxWaitTime), shell=True)

output = output.split('\n')[-3:]
# -1 is a blank line, -3 & -2 contain the actual results

xmit_stats = output[0].split(",")
timing_stats = output[1].split("=")[1].split("/")

packet_loss = float(xmit_stats[2].split("%")[0])

ping_min = float(timing_stats[0])
ping_avg = float(timing_stats[1])
ping_max = float(timing_stats[2])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接