linux上的/ proc / net / dev的输出如下所示:
Inter-| Receive | Transmit face |bytes packets errs drop fifo frame com@R_301_4848@ multicast|bytes packets errs drop fifo colls carrIEr com@R_301_4848@ 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将此输出parsing为每个接口的key:value对? 我发现这个论坛主题使用shell脚本实现它,有一个Perl扩展,但我需要使用Python。
使用windows命令行或Python查找具有模式的文本行
使用unixterminalparsingXML
C中的基于文件的configuration处理(Unix)
Win32:如何将string转换为date?
奇怪的无法parsing的外部编译DLL
这是相当格式化的输入,你可以通过分割每一行,很容易地获得列和数据列表,然后创建一个字典。
这里是一个没有正则表达式的简单脚本
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_com@R_301_4848@': '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_com@R_301_4848@': '0','trans_drop': '0','trans_errs': '0','trans_fifo': '0','trans_packets': '12148'},' eth0': {'recv_bytes': '34084530','recv_packets': '30599','trans_bytes': '6170441','trans_packets': '32377'}}
#!/usr/bin/env python from __future__ import with_statement import re import pprint ifaces = {} with open('/proc/net/dev') as fd: lines = map(lambda x: x.strip(),fd.readlines()) lines = lines[1:] lines[0] = lines[0].replace('|',':',1) lines[0] = lines[0].replace('|',' ',1) lines[0] = lines[0].split(':')[1] keys = re.split('s+',lines[0]) keys = map(lambda x: 'rx' + x[1] if x[0] < 8 else 'tx' + x[1],enumerate(keys)) for line in lines[1:]: interface,values = line.split(':') values = re.split('s+',values) if values[0] == '': values = values[1:] values = map(int,values) ifaces[interface] = dict(zip(keys,values)) pprint.pprint(ifaces)
这有帮助吗?
dev = open("/proc/net/dev","r").readlines() header_line = dev[1] header_names = header_line[header_line.index("|")+1:].replace("|"," ").split() values={} for line in dev[2:]: intf = line[:line.index(":")].strip() values[intf] = [int(value) for value in line[line.index(":")+1:].split()] print intf,values[intf]
输出:
lo [803814,16319,803814,0] eth0 [123605646,102196,9029534,91901,0] wmaster0 [0,0] eth1 [0,0] vBoxnet0 [0,0] pan0 [0,0]
当然,您可以使用header_names的标题名称来构造一个字典的字典。
总结以上是内存溢出为你收集整理的如何使用Python将/ proc / net / dev的输出parsing为每个接口的key:value对?全部内容,希望文章能够帮你解决如何使用Python将/ proc / net / dev的输出parsing为每个接口的key:value对?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)