복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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을 구성 할 수 있습니다.

  4. 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