设为首页 收藏本站
查看: 1270|回复: 0

shell之打印数组的键与值及常用查询脚本

[复制链接]
发表于 2018-8-30 09:33:29 | 显示全部楼层 |阅读模式
  Shell写起来很简单,效果却很神奇,你可以先尝试执行一下这条命令:
  netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
  会得到类似下面的结果,具体数字会有所不同:
  LAST_ACK         1
  SYN_RECV         14
  ESTABLISHED      79
  FIN_WAIT1        28
  FIN_WAIT2        3
  CLOSING          5
  TIME_WAIT        1669
  也就是说,这条命令可以把当前系统的网络连接状态分类汇总。
  下面解释一下为啥要这样写:
  一个简单的管道符连接了netstat和awk命令。
  ------------------------------------------------------------------
  先来看看netstat:
  netstat -n
  Active Internet connections (w/o servers)
  Proto Recv-Q Send-Q Local Address           Foreign Address         State
  tcp        0      0 123.123.123.123:80      234.234.234.234:12345   TIME_WAIT
  你实际执行这条命令的时候,可能会得到成千上万条类似上面的记录,不过我们就拿其中的一条就足够了。
  ------------------------------------------------------------------
  再来看看awk:
  /^tcp/
  滤出tcp开头的记录,屏蔽udp, socket等无关记录。
  
  state[]
  相当于定义了一个名叫state的数组
  NF
  表示记录的字段数,如上所示的记录,NF等于6
  $NF
  表示某个字段的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是TIME_WAIT
  state[$NF]
  表示数组元素的值,如上所示的记录,就是state[TIME_WAIT]状态的连接数
  ++state[$NF]
  表示把某个数加一,如上所示的记录,就是把state[TIME_WAIT]状态的连接数加一
  END
  表示在最后阶段要执行的命令
  for(key in state)
  遍历数组
  print key,"\t",state[key]
  打印数组的键和值,中间用\t制表符分割,美化一下。
  转自:http://huoding.com
  顺便附上常用查询脚本:
  查看所有80端口的连接数
  netstat -nat|grep -i  "80" |wc –l
  对连接的IP按连接数量进行排序
  netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort –n
  查看TCP连接状态
  netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn
  netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}'
  netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"\t",state[key]}'
  netstat -n | awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k,"\t",arr[k]}'
  netstat -n |awk '/^tcp/ {print $NF}'|sort|uniq -c|sort -rn
  netstat -ant | awk '{print $NF}' | grep -v '[a-z]' | sort | uniq –c
  查看80端口连接数最多的20个IP
  netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20
  netstat -ant |awk '/:80/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A,i}' |sort -rn|head -n20
  用tcpdump嗅探80端口的访问看看谁最高
  tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -20
  查找较多time_wait连接
  netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20
  查找较多的SYN连接
  netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more
  ================================================================
  apache日志分析可以获得很多有用的信息,现在来试试最基本的,获取最多访问的前10个IP地址及访问次数。
  cat access.log |awk '{print $1}' |sort |uniq -c |sort -rn |wc -l 统计访问IP的总数
  cat access.log |awk '{print $1}' |sort |uniq -c |sort -rn 统计访问IP
  cat access.log |awk '{print $1}' |sort |uniq -c |sort -rn|head 100 统计前100访问IP
  既然是统计,那么awk是必不可少的,好用而高效。
  命令如下:
  awk '{a[$1] += 1;} END {for (i in a) printf("%d %s\n", a, i);}' 日志文件 | sort -n | tail
  首先用awk统计出来一个列表,然后用sort进行排序,最后用tail取最后的10个。
  以上参数可以略作修改显示更多的数据,比如将tail加上-n参数等,另外日志格式不同命令也可能需要稍作修改。
  当前WEB服务器中联接次数最多的ip地址
  #netstat -ntu |awk '{print $5}' |sort | uniq -c| sort -nr
  查看日志中访问次数最多的前10个IP
  #cat access_log |cut -d ' ' -f 1 |sort |uniq -c | sort -nr | awk '{print $0 }' | head -n 10 |less
  查看日志中出现100次以上的IP
  #cat access_log |cut -d ' ' -f 1 |sort |uniq -c | awk '{if ($1 > 100) print $0}'|sort -nr |less
  查看最近访问量最高的文件
  #cat access_log |tail -10000|awk '{print $7}'|sort|uniq -c|sort -nr|less
  查看日志中访问超过100次的页面
  #cat access_log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less
  统计某url,一天的访问次数
  #cat access_log|grep '12/Aug/2009'|grep '/images/index/e1.gif'|wc|awk '{print $1}'
  前五天的访问次数最多的网页
  #cat access_log|awk '{print $7}'|uniq -c |sort -n -r|head -20
  从日志里查看该ip在干嘛
  #cat access_log | grep 218.66.36.119| awk '{print $1"\t"$7}' | sort | uniq -c | sort -nr | less
  列出传输时间超过 30 秒的文件
  #cat access_log|awk '($NF > 30){print $7}' |sort -n|uniq -c|sort -nr|head -20
  列出最最耗时的页面(超过60秒的)
  #cat access_log |awk '($NF > 60 && $7~/\.php/){print $7}' |sort -n|uniq -c|sort -nr|head -100


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-558751-1-1.html 上篇帖子: shell脚本编程之for语句、if语句使用介绍 下篇帖子: 【shell】使用ping检测机器是否不在线
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表