第四节 awk数组和函数

一、数组 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()


(3)$? 返回0表示正确 非0错误






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值