<form id="dlljd"></form>
        <address id="dlljd"><address id="dlljd"><listing id="dlljd"></listing></address></address>

        <em id="dlljd"><form id="dlljd"></form></em>

          <address id="dlljd"></address>
            <noframes id="dlljd">

              聯系我們 - 廣告服務 - 聯系電話:
              您的當前位置: > 關注 > > 正文

              即時焦點:正則解析網絡運維數據之OneTake 解析網絡運維數據

              來源:CSDN 時間:2023-01-16 07:53:42

              今天我們帶大家寫個正則表達式,解析一下我們的網絡運維數據。寫的時候我會分成兩種風格:

              one take

              分而治之分別對應網絡配置中的兩種常見的形式。


              【資料圖】

              今天的分享,我們先講one take,也就是一次完成提取。【林志炫的專輯】。

              網絡設備配置(show 出來的,包含config和status)的解析有些是適合一次過的,比如show mac,arp,interface brief等很多信息在一行中的。我們只要寫好一個正則,很多信息都可以一次獲取解析出來。這種最大的特點就是一行包含一條信息。

              我們登陸devnet提供的一臺虛擬的N9K設備,執行命令show int brief如下

              講下我的思路,寫一個正則,能提取端口信息的每個字段信息,然后把整個log用換行切割開,for循環,提取每行內的端口信息,有就追加到一個端口列表中,沒有繼續下一行。直到循環結束,我們就可以拿到所有端口的信息了。

              下面我們開始寫正則。其實從show出來的log里我們也能知道我們需提取那些字段,比如端口名,vlan,類型,模式,狀態以及狀態的原因,速率,所屬的portchannel。我們就一一解析出來。

              我們先直接上代碼,然后細細講講

              寫一次正則,然后每行去正則匹配,就可以非常方便的把信息解析出來了。

              這個正則看起來很復雜,可能嚇跑很多同學,咱們別著急,庖丁解牛,一個個的分析,其實很容易就寫出正則。

              我們看到最初的配置,我們在行內從端口名稱一個個找。

              首先寫端口的名稱 是“Eth數字\數字”,我們寫成正則就是Eth\d+/\d+,我們捕獲這個子串,用圓括號圈起來就是“(Eth\d+/\d+)”,然后是vlan 是數字或者“--”,我們可以寫成“(\d+|--)”,和端口中間是空格,為了不數空格,我們用\s+來代表多個空格,我們就接著在端口的正則后面寫“(Eth\d+/\d+) \s+(\d+|--)”

              我們每寫一點可以執行代碼,去匹配一下看看輸出結果,看看能不能解析打印出來,不合適的就去調整。

              正則的方式千千萬萬,我們可以適當的去調整它的一些特征,去盡量匹配準確一些,比如access、trunk、routed三種,將來萬一再多一些,我們可以把這段用“(\w+)”去捕獲,比較限定死的方式是“(access|trunk|routed)”,大家根據自己情況去寫。后面就一點點加進去。

              這里面有個小坑,就是reason。

              端口狀態的原因有可能是兩個單詞也可能是一個單詞,這個時候我們如果用字符去匹配的話沒法兼容兩種情況。

              所以我用的方法是“([\s\S]+?)”匹配原因,后面的在端口速率和portchannel那寫死,中間用貪婪匹配所有的狀態和速率之間的字符或者空格,這樣就提取除了reason 這個字段。

              寫的過程中,我是一次寫完正則,但是沒過,后來我從后面去除一些正則,加一個,打印正確就再加一個再試試。這個方法大家可以去嘗試,一次過,真的很不容易。

              這個特別適合寫mac arp 端口(brief)一行的情況解析。

              我們再來練習一個arp地址解析吧。

              arp的特征非常明顯,IP地址,存活時間,mac地址和端口

              開啟第一視角,先去匹配IP,這個IP不是那么嚴謹,但是在匹配過程中足夠了,注意“.”在正則里是有特殊含義的,所以需要轉義。

              然后陸續添加時間,我們可以用非空字符去表示,那就是(\S+)

              mac地址是“([a-fA-F0-9]{4}\.[a-fA-F0-9]{4}\.[a-fA-F0-9]{4})” 這個用了嚴謹的寫法,就是給大家更多思路。

              vlan的我就不寫了 大家自己動手謝謝試試吧

              今天分享的講了怎么用正則處理這種單行的解析。有些負責的我們會用分而治之的方法,比如端口的配置或者show,后續分享。

              解析不是目的,數據產生是后續場景使用的基礎,數據的使用才是目的。比如我們統計資源信息、做安全管理、IP地位等等。

              一定要落地到場景里去,大家每次想問題也要帶著場景去思考,我能用自動化做什么,這個事情能不能用自動化做等等。

              補充一個知識點:分割行的時候我們用的是\n,大家根據實際情況去分割。

              Linux采集下的大部分是\r\n 有時候是\\r\\n,建議大家采集回來后統一替換。

              最后奉上兩端代碼:

              我們只是打印出來,大家按實際使用去消費數據,建議封裝成字典或者對象入庫入表。包括“--”我沒有處理成None或者其他值,都是需要大家注意的地方。

              import rewith open("show_int_bri.log","r",encoding="utf8") as f:    log = f.read()    interfae_info_pattern = re.compile(r"(Eth\d+/\d+)\s+(\d+|--)\s+(\w+)\s+(\w+)\s+(\w+)\s+([\s\S]+?)\s+(\w+)\(D\)\s+(\S+)")    lines = log.split("\n")    for line in lines:        match =  interfae_info_pattern.match(line)        if match:            print(match.groups())

              import rewith open("showarp.log","r",encoding="utf8") as f:    log = f.read()    arp_pattern = re.compile(r"(\d+\.\d+\.\d+\.\d+)\s+(\S+)\s+([a-fA-F0-9]{4}\.[a-fA-F0-9]{4}\.[a-fA-F0-9]{4})")    lines = log.split("\n")    for line in lines:        match =  arp_pattern.match(line)        if match:            print(match.groups())

              責任編輯:

              標簽:

              相關推薦:

              精彩放送:

              新聞聚焦
              Top 中文字幕在线观看亚洲日韩