跳到主要内容

[toc]

awk数组

1.awk数组格式

数组名[索引]=值

2.创建awk数组

//创建一个数组,数组名是a,数组的索引是"aaa""bbb"
[root@test1 ~]# awk 'BEGIN{a["aaa"]="www.aaa.com";a["bbb"]="www.bbb.com"; print a["aaa"] "\n" a["bbb"]}'
www.aaa.com
www.bbb.com

3.删除数组元素

//使用delete 数组名[索引] 删除数组元素
[root@test1 ~]# awk 'BEGIN{a["aaa"]="www.aaa.com";a["bbb"]="www.bbb.com";delete a["aaa"]; print a["aaa"] "\n" a["bbb"]}'

www.bbb.com

4.按照索引遍历

//以下示例了以统计的字段为数组的索引
[root@test1 ~]# awk -F: '{a[++i]=$1} END{print a[1]}' /etc/passwd
root
[root@test1 ~]# awk -F: '{a[i++]=$1} END{print a[1]}' /etc/passwd
bin
[root@test1 ~]# head -2 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

5.awk数组示例

5.1 简单示例

5.1.1 统计/etc/passwd中各种类型shell的数量

[root@test1 ~]# awk -F: '{a[$NF]++} END{for(i in a){print i,a[i]}}' /etc/passwd
/bin/sync 1
/bin/bash 2
/sbin/nologin 22
/sbin/halt 1
/sbin/shutdown 1

5.1.2 80端口访问状态统计

[root@test1 ~]# ss -an|awk '/:80/{a[$2]++} END{for(i in a){print i,a[i]}}'
LISTEN 3

5.2 结合日志文件的示例

nginx访问日志格式如下

82.113.63.230 - - [25/Jan/2019:15:15:56 +0800] "GET / HTTP/1.1" 301 169 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" "-"

5.2.1 统计2019年1月25日当天的PV量

[root@test1 ~]# awk '/25\/Jan\/2019/{i++}END{print i}' /var/log/nginx/access.log
90

5.2.2 统计15-19点的PV量

[root@test1 ~]# awk '$4>="[25/Jan/2019:15:00:00" && $4<="[25/Jan/2019:19:00:00 {print $0}"' /var/log/nginx/access.log|wc -l

5.2.3 统计2019年1月25日当天内访问最多的10个IP

[root@test1 ~]# awk '/25\/Jan\/2019/ {a[$1]++} END {for(i in a){print i,a[i]}}' /var/log/nginx/access.log |sort -rn|head

5.2.4 统计2019年1月25日15-19点访问次数最多的10个IP

[root@test1 ~]# awk '$4>="[25/Jan/2019:15:00:00" && $4<="[25/Jan/2019:19:00:00"' /var/log/nginx/access.log |awk '{ips[$1]++} END {for(i in ips){print ips[i],i}}'|sort -rn|head

5.2.5 统计2019年1月25日访问次数大于100的IP

[root@test1 ~]# awk '/25\/Jan\/2019/ {a[$1]++} END {for(i in a){if(a[i]>10){print i,a[i]}}}' /var/log/nginx/access.log

5.2.6 统计2019年1月25日访问最多的10个页面($requests top 10)

//nginx访问日志中第7列是访问url
[root@test1 ~]# awk '/25\/Jan\/2019/ {a[$7]++} END {for(i in a){print a[i],i}}' /var/log/nginx/access.log |sort -rn|head

5.2.7 统计每个IP访问状态码的数量

[root@test1 ~]# awk '{a[$1 " " $9]++} END {for(i in a){print a[i],i}}' /var/log/nginx/access.log|sort -rn|head
10 101.227.27.188 301
9 113.193.226.3 301
3 59.36.132.240 301
3 182.254.52.17 301
2 80.82.70.187 301
2 64.246.161.190 302
2 14.18.182.223 302
2 14.18.182.223 301
2 124.161.103.251 301
1 83.97.20.33 301

5.2.8 统计访问状态码为404及出现的次数($status)

//统计某一天的
[root@test1 ~]# awk '{if($9=="404") a[$9]++} END {for(i in a){print i,a[i]}}' /var/log/nginx/access.log


//统计某一天某一时刻的
[root@test1 ~]# awk '$4>="[25/Jan/2019:15:00:00" && $4<="[25/Jan/2019:19:00:00" && $9=="404" {a[$9]++} END {for(i in a){print i,a[i]}}' /var/log/nginx/access.log