文章目录
- 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。。。
- 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