跳到主要内容

[toc]

awk数组

awk数组格式

数组名[索引]=值

创建awk数组

说明

创建一个数组,数组名是 a ,数组的索引是 aaabbb

$ awk 'BEGIN{a["aaa"]="www.aaa.com";a["bbb"]="www.bbb.com"; print a["aaa"] "\n" a["bbb"]}'
www.aaa.com
www.bbb.com

删除数组元素

说明

使用 delete 数组名[索引] 删除数组元素

$ awk 'BEGIN{a["aaa"]="www.aaa.com";a["bbb"]="www.bbb.com";delete a["aaa"]; print a["aaa"] "\n" a["bbb"]}'

www.bbb.com

按照索引遍历

以统计的字段为数组的索引

$ head -2 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

$ awk -F: '{a[++i]=$1} END{print a[1]}' /etc/passwd
root

$ awk -F: '{a[i++]=$1} END{print a[1]}' /etc/passwd
bin

awk数组示例

简单示例

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

$ 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

80端口访问状态统计

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

结合日志文件的示例

nginx访问日志格式如下

82.113.63.230 - - [25/Jan/2025: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" "-"

统计当天的PV量

$ awk '/25\/Jan\/2025/{i++}END{print i}' /var/log/nginx/access.log
90

统计15-19点的PV量

$ awk '$4>="[25/Jan/2025:15:00:00" && $4<="[25/Jan/2025:19:00:00 {print $0}"' /var/log/nginx/access.log|wc -l

统计当天内访问最多的10个IP

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

统计访问次数最多的10个IP

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

统计访问次数大于100的IP

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

访问最多的10个页面($requests top 10)

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

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

$ awk '{a[$1 " " $9]++} END {for(i in a){print a[i],i}}' /var/log/nginx/access.log|sort -rn|head
10 1.1.1.1 301
9 2.2.2.2 301
3 3.3.3.3 301
3 4.4.4.4 301
2 5.5.5.5 301
2 6.6.6.6 302
2 7.7.7.7 302
2 8.8.8.8 301
2 9.9.9.9 301
1 10.10.10.10 301

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

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


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