一、数组 array
1.数组简介
简单来说:数组是存的一组数,将一组相关数据按照一定的顺序存放在一起
一般用于从记录中收集信息、统计次数、记录某个模式出现的次数等等。
2.创建数组
数组名[数组下标]=值
arr1[1]="a"
arr1[2]="b"
awk中,数组下标既可以是数字、也可以是变量、还可以是字符串(字符串必须加双引号)
注意:数组下标如果是数字:从1开始,而c语言是从0开始
数组可以定义后再使用,也可以直接使用。
3.删除单个键值(数组元素):
delete ARRAY[INDEX]
# awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";delete tB["a"];for(k in tB){print k,tB[k];}}'
b b1
4.删除整个数组:
方法 1:
for (VAR in ARRAY)
delete ARRAY[VAR]
方法 2: 该方法 gawk (gnu awk)专用,可移植性差,但效率是方法 1 的 3 倍左右
delete ARRAY
5.数组和变量命名空间:
awk 的数组和变量用的是同一个地址空间,数组的名字和变量名不能重名。
即使数组被删除了也不能将名字用于变量命名,如以下的命令会报错:
a[1]=3; delete a ;a=3
6.数组的遍历:
用循环去遍历数组元素
for (数组下标 in 数组名){ ... }
for (i in ip) i--代表下标
例题:1. awk 'BEGIN{ip["127.0.0.1"]=1;ip["192.168.1.1"]=2;for (i in ip){print i, ip[i] } }'
2. awk '{ip[s1++;]}'
7.数组下标的两种类型:
(1)使用数值做下标
arr[1] arr[3] arr[x++] arr[NR]
#awk '{arr[x++]=$1};END{for (i=NR-1;i>0;i--){print i,arr [i] } }' /etc/passwd
# awk '{arr[NR]=$1};END{for (i=NR;i>0;i--){print i,arr[i]}}' employees
(2)使用字符串做下标
# awk '{ip[$1]++}END{for (i in ip) {print i,ip[i]}}' /var/log/httpd/access_log
# awk '{ip[$1]++}END{for(i in ip){print i,ip[i]}}' /var/log/httpd/access_log |sort -nr -t " " -k 2 | head
重点例题:
统计/etc/passwd中最后一行每一种shell出现的次数
awk -F: '{shells[$NF]++} END{for (i in shells){print i ,shell[i]}}' /etc/passwd
网站访问状态统计
netstat -ant | grep ':80'|awk '{status[$NF]++}END{for (i in status) {print i , status[i] } }' |sort -k2 -n
统计访问网站最高的IP的前五个
ss -ant |grep ':80' |awk -F":" '!/LISTEN/{ips[$(NF-1)]++}EDN{for (i in ips){print i ,ips[i]}}' |sort -k2 -rn |head -5
注:sort 排序
-n 按数字排序
-r 倒序
-t 指定分隔符
-k 第几列 排序键
#cat /etc/passwd | sort
8.数组相关函数
得到数组的长度
length(数组名称)
# awk 'BEGIN{a[1]=8;a[2]=9;print length(a)}'
二、函数
1.内置函数
1)大小写转换函数
toupper() 小写变大写
tolower() 大写变小写
# awk '{print toupper($1)}' score
# awk '{print tolower($1)}' datafile3
2.自定义函数
自定义函数(功能函数) function
格式:
函数名 (参数) { //参数是可选的
函数体;
返回值;
}
(1)自定义一个函数
# awk 'function over() {print "class is over"} {over()}' a class is over
(2)函数的调用: 函数名(参数)
over()