[PYTHON] 어떻게하면 / proc / net / dev의 출력을 파이썬을 사용하여 인터페이스 당 key : value 쌍으로 파싱 할 수 있습니까?
PYTHON어떻게하면 / proc / net / dev의 출력을 파이썬을 사용하여 인터페이스 당 key : value 쌍으로 파싱 할 수 있습니까?
리눅스에서 / proc / net / dev의 출력은 다음과 같습니다 :
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
파이썬을 사용하여이 출력을 각 인터페이스에 대한 키 : 값 쌍으로 구문 분석 할 수 있습니까? 쉘 스크립팅을 사용하여이 포럼 주제를 찾았으며 Perl 확장이 있지만 파이썬을 사용해야합니다.
해결법
-
==============================
1.이것은 꽤 형식화 된 입력이며, 각 행을 분할하여 열과 데이터 목록을 쉽게 얻을 수 있으며, 그 다음에 그 열거를 작성할 수 있습니다.
이것은 꽤 형식화 된 입력이며, 각 행을 분할하여 열과 데이터 목록을 쉽게 얻을 수 있으며, 그 다음에 그 열거를 작성할 수 있습니다.
다음은 정규식이없는 간단한 스크립트입니다.
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'}}
-
==============================
2.
#!/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)
-
==============================
3.이게 도움이 되나요?
이게 도움이 되나요?
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, 0, 0, 0, 0, 0, 0, 803814, 16319, 0, 0, 0, 0, 0, 0] eth0 [123605646, 102196, 0, 0, 0, 0, 0, 0, 9029534, 91901, 0, 0, 0, 0, 0, 0] wmaster0 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] eth1 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] vboxnet0 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] pan0 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
물론 header_names의 헤더 이름을 사용하여 dicts의 dict을 구성 할 수 있습니다.
from https://stackoverflow.com/questions/1052589/how-can-i-parse-the-output-of-proc-net-dev-into-keyvalue-pairs-per-interface-u by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] ImportError : 'Queue'라는 모듈이 없습니다. (0) | 2018.11.28 |
---|---|
[PYTHON] Matplotlib python show ()가 즉시 반환됩니다. (0) | 2018.11.28 |
[PYTHON] 아름다운 스프 결과에 누락 된 부분 (0) | 2018.11.28 |
[PYTHON] 도메인이 DNSSEC로 보호되어 있는지 프로그래밍 방식으로 확인 (0) | 2018.11.28 |
[PYTHON] 복제로 데이터 정규화 (0) | 2018.11.28 |