python - 如何将/proc/net/dev 的输出解析为 key :value pairs per interface using Python?

标签 python linux parsing

/proc/net/dev 的输出在 Linux 上看起来像这样:

Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
    lo:18748525  129811    0    0    0     0          0         0 18748525  129811    0    0    0     0       0          0
  eth0:1699369069 226296437    0    0    0     0          0      3555 4118745424 194001149    0    0    0     0       0          0
  eth1:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
  sit0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0

如何使用 Python 将此输出解析为每个接口(interface)的键值对?我找到了 this forum topic使用 shell 脚本实现它并且有 a Perl extension但我需要使用 Python。

最佳答案

这是格式化的输入,您可以通过拆分每一行轻松获取列和数据列表,然后创建它的字典。

这是一个没有正则表达式的简单脚本

lines = open("/proc/net/dev", "r").readlines()

columnLine = lines[1]
_, receiveCols , transmitCols = columnLine.split("|")
receiveCols = map(lambda a:"recv_"+a, receiveCols.split())
transmitCols = map(lambda a:"trans_"+a, transmitCols.split())

cols = receiveCols+transmitCols

faces = {}
for line in lines[2:]:
    if line.find(":") < 0: continue
    face, data = line.split(":")
    faceData = dict(zip(cols, data.split()))
    faces[face] = faceData

import pprint
pprint.pprint(faces)

输出

{'    lo': {'recv_bytes': '7056295',
            'recv_compressed': '0',
            'recv_drop': '0',
            'recv_errs': '0',
            'recv_fifo': '0',
            'recv_frame': '0',
            'recv_multicast': '0',
            'recv_packets': '12148',
            'trans_bytes': '7056295',
            'trans_carrier': '0',
            'trans_colls': '0',
            'trans_compressed': '0',
            'trans_drop': '0',
            'trans_errs': '0',
            'trans_fifo': '0',
            'trans_packets': '12148'},
 '  eth0': {'recv_bytes': '34084530',
            'recv_compressed': '0',
            'recv_drop': '0',
            'recv_errs': '0',
            'recv_fifo': '0',
            'recv_frame': '0',
            'recv_multicast': '0',
            'recv_packets': '30599',
            'trans_bytes': '6170441',
            'trans_carrier': '0',
            'trans_colls': '0',
            'trans_compressed': '0',
            'trans_drop': '0',
            'trans_errs': '0',
            'trans_fifo': '0',
            'trans_packets': '32377'}}

关于python - 如何将/proc/net/dev 的输出解析为 key :value pairs per interface using Python?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1052589/

相关文章:

ios - 如何用 Swift 解析 Apple Watch 中的服务?

c - 标记字符串

node.js - Node js不使用fast-csv库解析csv文件

linux - 无法从同一 LAN 上的 Linux 计算机 ping Windows 7 计算机

PHP 仅在 Apache 中不呈现单个别名

python - 如何报告 Python UDF(针对 Pig)的进度?

python - 为什么 PyCharm 在某些 Numpy 导入时会给出 Unresolved reference 错误?

python - 使用Python 2.7打印字符串变量中的颜色字符

python - 如何计算高分辨率图像之间的匹配特征?

linux - 我想知道linux内存对齐和布局