工作中的shell數據提取與操作

問題一:有臺正常運行的服務器,共有48個網口,並且網口號處於沒有經過調整的混亂狀態,怎樣快速的找出eth0~eth47對應的物理網口位置?

shell命令# for i in `seq 0 47`; do ethtool -p eth$i 2; done

說明:遍歷i=0~47,對每個 eth$i , 執行 ethtool -p 命令,意思是點亮該網口2秒鐘。

 

問題二:查看linux系統所有網口的驅動版本、鏈接狀態等信息

shell命令#ifconfig -a | grep eth | awk '{print $1}' | sed 's/eth//g' | sort -n | while read i; do echo eth$i; ethtool -i eth$i; ethtool eth$i | egrep "Link|Supported"; echo " ";done

說明:包含一些基本工具的應用,沒什麼技術含量。

 

問題三:服務器/var/log/blackbox 目錄下有很多日期目錄,目錄名稱是01,02,...28,29,30. 分別表示系統運行的當天號數(本月和下月記錄會循環覆蓋);每個時間號目錄下,都有一個 net 文件,net文件記錄了系統每分鐘所有網口的狀態信息(net內容格式是date;ethtool ethN,的每分鐘執行打印的結果,其中N=0~47)。現在突然某天發現某一網口有異常,其ethtool ethN的Speed是Speed:Unknown!,而Link detected: yes ,問如何通過/var/log/blackbox的黑盒記錄,找到網口異常發生的起始時間?

shell命令#find ./ -name net | while read file; do cat $file >> netAll; done

shell命令#awk '{b="";errorLineNum+=1}; /Speed:/{a=$2}; /Link detected:/{b=$3}; {if(a=="Unknown!" && b=="yes")print errorLineNum}' netAll > rlt

說明:首先找到所有日期下的net文件,合併爲netAll,便於統一處理(這不會丟失時間信息,因爲系統每分鐘執行ethtool的時候,都已經附帶執行了date命令,記錄了時間信息)。然後,通過awk語言特性,遍歷每行文件,只要匹配Speed:,則記錄speed的結果到a變量;只要匹配到 Link detected:,則記錄結果到b變量;因爲a,b在處理每行的數據時,它的值在沒匹配時都會保持上一個值,所以這裏需要每次對b進行初始化爲空(手動調試一下就可理解)。一旦a,b的值同時滿足要求時,打印該行的行號。然後通過 vim netAll 打開,輸入記錄的errorLineNum行號,回車,即可直接定位到問題發生時的第一時間點。爲什麼這裏這麼費事的用awk語言?因爲netAll文件有3718990行,手動尋找符合特徵要求的時間點不現實。實際工作中,本人定位的問題發生的起始點是netAll的第60518行,對應的時間點是Wed Jun 27 03:53:34 CST 2018,也就是在6月27號凌晨3點多發生該網口異常。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章