You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 06:32:43