视频的容积 发表于 2018-8-30 09:33:29

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

  Shell写起来很简单,效果却很神奇,你可以先尝试执行一下这条命令:
  netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state}'
  会得到类似下面的结果,具体数字会有所不同:
  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状态的连接数
  ++state[$NF]
  表示把某个数加一,如上所示的记录,就是把state状态的连接数加一
  END
  表示在最后阶段要执行的命令
  for(key in state)
  遍历数组
  print key,"\t",state
  打印数组的键和值,中间用\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}'
  netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"\t",state}'
  netstat -n | awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k,"\t",arr}'
  netstat -n |awk '/^tcp/ {print $NF}'|sort|uniq -c|sort -rn
  netstat -ant | awk '{print $NF}' | grep -v '' | 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]}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]
查看完整版本: shell之打印数组的键与值及常用查询脚本