Python脚本读取iperf3输出提取接收端数据问题求助
解决方案
一、修正正则匹配方案
首先明确iperf3接收端输出行的典型格式:
[ 5] 0.00-10.00 sec 11.2 GBytes 9.63 Gbits/sec receiver
现有正则大概率存在未精准匹配接收端标识、分组未兼容空格/单位、未处理多行匹配的问题,以下是修正后的实现:
修正代码示例
import re import yaml # 替换为实际读取的iperf3输出内容 iperf_output = """ [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-1.00 sec 1.12 GBytes 9.63 Gbits/sec receiver [ 5] 1.00-2.00 sec 1.11 GBytes 9.55 Gbits/sec receiver [ 5] 2.00-3.00 sec 1.12 GBytes 9.62 Gbits/sec receiver [ 5] 0.00-3.00 sec 3.35 GBytes 9.60 Gbits/sec receiver """ # 精准匹配接收端数据的正则表达式 pattern = re.compile(r'\[\s+\d+\]\s+(\d+\.\d+-\d+\.\d+)\s+sec\s+([\d.]+\s+\w+Bytes)\s+([\d.]+\s+\w+bits/sec)\s+receiver') # 提取所有匹配数据 receiver_data = [] for match in pattern.finditer(iperf_output): receiver_data.append({ "Interval": match.group(1), "Transfer": match.group(2).strip(), "Bandwidth": match.group(3).strip() }) # 生成YAML输出 yaml_result = yaml.dump({"receiver_results": receiver_data}, sort_keys=False) print(yaml_result)
正则逻辑说明
\[\s+\d+\]:匹配iperf的ID列(兼容多空格格式,比如[ 5])(\d+\.\d+-\d+\.\d+):捕获Interval区间(比如0.00-1.00)([\d.]+\s+\w+Bytes):捕获Transfer值及单位(比如1.12 GBytes)([\d.]+\s+\w+bits/sec):捕获Bandwidth值及单位(比如9.63 Gbits/sec)\s+receiver:强制匹配接收端标识,彻底排除发送端数据
二、更稳定的替代方案:使用iperf3 JSON输出
正则匹配依赖输出格式,若iperf3版本更新导致格式变化,正则会直接失效。更可靠的方式是利用iperf3官方支持的JSON输出接口:
步骤1:执行iperf3时输出JSON
iperf3 -c <你的服务器IP> -t 10 --json > iperf_result.json
步骤2:Python解析JSON并生成YAML
import json import yaml # 读取iperf3的JSON结果 with open('iperf_result.json', 'r') as f: iperf_json = json.load(f) # 提取接收端区间数据并转换格式 receiver_data = [] for interval in iperf_json['intervals']: receiver_data.append({ "Interval": f"{interval['start']:.2f}-{interval['end']:.2f}", "Transfer": f"{interval['sum']['bytes'] / (1024**3):.2f} GBytes", "Bandwidth": f"{interval['sum']['bits_per_second'] / (10**9):.2f} Gbits/sec" }) # 生成YAML yaml_result = yaml.dump({"receiver_results": receiver_data}, sort_keys=False) print(yaml_result)
方案优势
- 基于官方定义的JSON结构,不受输出格式变化影响
- 直接获取原始数值,可灵活转换单位,避免正则匹配字符串的误差
内容的提问来源于stack exchange,提问作者DevOps__1903
相关产品推荐
相关产品推荐

