工作中的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点多发生该网口异常。




猜你喜欢

转载自blog.csdn.net/sf_jiang/article/details/80861502