0
点赞
收藏
分享

微信扫一扫

(11.6)awk工作原理之数组


文章目录

  • ​​1.awk数组​​
  • ​​2.例子思想:将需要统计的内容(某1字段)作为数组的索引,然后++即可​​
  • ​​3.awk的变量,内置函数及外部变量​​

1.awk数组

  • awk不区分普通数组或者关联数组

i从1开始
awk -F: '{username[++i]=$1} END{print username[1]}' /etc/passwd

i从0开始
awk -F: '{username[i++]=$1} END{print username[1]}' /etc/passwd

  • 数组遍历:按照下标遍历

awk -F: '{user[j++]=$1} END{for(i in user){print i,user[i]}}' passwd
这里的i表示的下标

2.例子思想:将需要统计的内容(某1字段)作为数组的索引,然后++即可

  • eg1:统计/etc/passwd中各种类型shell的数量

awk -F: '{shells[$NF]++}END{for(i in shells){print $i,shells[i]}}' /etc/passwd
注意,i是下标,即:/bin/sync,/bin/bash。。。

(11.6)awk工作原理之数组_数组

  • eg2:网站访问状态

t表示tcp,a表示素有套接字类型
netstat -ant|grep ':80'|awk '{status[$NF]++} END{for(i in status){print i,status[i]}}'

ss -an|grep ':80'|awk '{status[$NF]++} END{for(i in status){print i,status[i]}}'
ss -an最后一列表示连接我的ip

-r是逆序,-k2表示按照2列排序,-n表示按照数值,head表示打印前10个
netstat -ant|grep ':80'|awk '{status[$NF]++} END{for(i in status){print i,status[i]}}'|sort -k2 -n |head

  • eg3:统计当前访问的每个IP的数量

$(NF-1):倒数第2列,!/LISTEN/表示除了监听的那个,head -5:表示前5个
ss -ant|grep ':80'|awk -F: '{!/LISTEN/ips[$(NF-1)]++} END{for(i in ips){print i,ips[i]}}'|sort -k2 -rn|head -5

  • eg4:统计Apache/Nginx中日志中某一天的PV量

grep '22/Mar/2017' logname|wc -l

  • eg5:统计Apache/Nginx中日志中不同IP某一天的PV量

head取出top10
awk '/22\/Mar\/2017/{ips[$i]++} END{for(i in ips){print i,ips[i]}}' logname|sort -k2 -rn|head
等价于
grep '/22/Mar/2017' filename|awk '{ips[$i]++} END{for(i in ips){print i,ips[i]}}' logname|sort -k2 -rn|head

访问次数>100才打印
awk '/22\/Mar\/2017/{ips[$i]++} END{for(i in ips){if(ips[i]>100){print i,ips[i]}}}' logname|sort -k2 -rn|head

3.awk的变量,内置函数及外部变量

  • 内置函数length:求出字符串长度

awk -F: 'length($1)==4{count++;print $1} END{print "count is:"count}' /etc/passwd

  • 内置函数:sub()查找替换(只找第一个),gsub类似于sed中的g(全局找)

var="bash"
echo "unix script"|awk "gsub(/unix/,\"$bash\")"
输出:
bash script

  • 内置函数:int

df -h|awk '{if((int($5)>5)){print $6":"$5}}'

  • 外部变量的使用,-v选项

echo "unix script"|awk -v var="bash" 'gsub(/unix/,var)'
输出:
bash script


举报

相关推荐

0 条评论