1. 程式人生 > >利用python陣列解析ifconfig命令輸出

利用python陣列解析ifconfig命令輸出

有時候我們需要對命令的格式化輸出進行解析,解析通常依賴命令自身的格式化特徵,不過這些特徵都有共性:各種層面的迴圈列表結構

比如ifconfig命令,首先迴圈列出所有網路介面,然後在網路介面內,在迴圈列出各個預定義欄位

所以對該命令解析時,首先要按list之list的結構對其輸出內容進行組織,這裡用python的(多維)陣列是個不錯的主意

#encoding=utf-8
import subprocess
tmp_file = open('/tmp/g.log','w')
subprocess.call(['ifconfig'], stdout=tmp_file)

tmp_file = open('/tmp/g.log','r')
ifaces = []
ifaces.append([]) #向陣列的尾端新增一個數組!
ifaces_cnt = 0
line_num = 0
for line_raw in tmp_file:
    line = line_raw.rstrip() #空行的長度為1,strip後長度才為0
    if len(line) > 0:
        ifaces[ifaces_cnt].append(line) #向陣列的尾端新增一個字串!
    else:
        ifaces_cnt = ifaces_cnt +1
        ifaces.append([])

print 'there are %d section'%len(ifaces)
for face in ifaces:
    print '========'
    for l in face:
        print l

執行輸出效果:
there are 3 section
========
eth1      Link encap:乙太網  硬體地址 00:1c:25:dd:44:8b
          inet 地址:192.168.0.105  廣播:192.168.0.255  掩碼:255.255.255.0
          inet6 地址: fe80::21c:25ff:fedd:448b/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  躍點數:1
          接收資料包:569916 錯誤:0 丟棄:0 過載:0 幀數:0
          傳送資料包:389975 錯誤:0 丟棄:0 過載:0 載波:0
          碰撞:0 傳送佇列長度:1000
          接收位元組:651139742 (651.1 MB)  傳送位元組:37622845 (37.6 MB)
          中斷:17
========
lo        Link encap:本地環回
          inet 地址:127.0.0.1  掩碼:255.0.0.0
          inet6 地址: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  躍點數:1
          接收資料包:17094 錯誤:0 丟棄:0 過載:0 幀數:0
          傳送資料包:17094 錯誤:0 丟棄:0 過載:0 載波:0
          碰撞:0 傳送佇列長度:0
          接收位元組:1578445 (1.5 MB)  傳送位元組:1578445 (1.5 MB)
========

多出來的1個section是邊界效應,請忽視