使用Python和正则表达式解析ping结果

2024-03-28 14:53:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python脚本,它在ping提供的IPv4和IPv6地址列表时生成一个输出文件,如下所示:

Item Number: [item number]

host = [hostname]
PING [IPv4]  
64 bytes from [dst.IP] icmp_seq=1 ttl=57 time=27.3 ms
64 bytes from [dst.IP] icmp_seq=2 ttl=57 time=26.8 ms
64 bytes from [dst.IP] icmp_seq=3 ttl=57 time=21.6 ms
.
.
.
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 21.604/25.248/27.333/2.589 ms


PING [IPv6] 
64 bytes from [dst.IP] icmp_seq=1 ttl=61 time=31.3 ms
64 bytes from [dst.IP] icmp_seq=2 ttl=61 time=22.0 ms
64 bytes from [dst.IP] icmp_seq=3 ttl=61 time=22.8 ms
.
.
.
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 22.098/25.480/31.866/4.519 ms

$$$$$

显然括号内的信息是变量。我的目标是提取每个IP版本的主机名、ttl和rtt最小值,这些值位于“Item Number”和“$$$$”之间,并将其导出到csv文件的一行。在

我无法想出一个合适的正则表达式来实现这一点。到目前为止,我只能提取一个条目编号的所有信息,即上述标记之间的所有文本:

^{pr2}$

此代码为每个匹配项省略“Item Number:”和“$$$$$”。在

任何帮助都将不胜感激。在


Tags: 文件fromrttipnumberbytestimeitem
1条回答
网友
1楼 · 发布于 2024-03-28 14:53:30

我建议您首先将文件拆分为块,然后按如下方式处理每个块:

import csv
import re
from itertools import chain

with open('file') as f_input, open('output.csv', 'wb') as f_output:
    text = f_input.read()
    csv_output = csv.writer(f_output)

    for block in re.findall(r'Item Number:(.*?)\${5}', text, re.S):
        re_hostname =  re.search(r'host = (.*)', block)
        if re_hostname:
            data = re.findall(r'ttl=(\d+) time=([0-9.]+) ', block)
            csv_output.writerow([re_hostname.group(1)] + list(chain.from_iterable(data)))

这将产生如下csv文件:

^{pr2}$

相关问题 更多 >