当前位置:   article > 正文

工作中的shell数据提取与操作_shell根据条件取数据

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

//20181207备注:其实可以用二分法对netALL文件查找问题发生时间点的。netALL文件380 0000行,二分查找 2^20 = 100 0000;所以最多只需要找22次就可以定位时间点。

问题四:在一台接收大量UDP报文的服务器上,如何快速的根据UDP报文的目的端口做报文数量的统计 (实际是服务器监听了多个UDP端口,需要查看发往该服务器的UDP报文是在端口上散列均匀)

shell命令# timeout 5 tcpdump -iany udp -n > hei

shell命令# cat hei | awk -F. '{print $10}' | awk -F: '{print $1}' | awk '{++times[$1]}END{for(i in times)print "port: "i" ="times[i]}' | sort -n -k 2

效果如下:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/389416
推荐阅读
相关标签
  

闽ICP备14008679号