awk数组
Posted henglinux
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了awk数组相关的知识,希望对你有一定的参考价值。
AWK数组
一.数组格式
数组是一个包含一系列元素的表.
格式如下:
abc[1]=”xiaohong”
abc[2]=”xiaolan”
解释:
abc :为数组名称
[1]、[2]:为数组元素下标,可以理解为数组的第1个元素、数组的第2个元素
”xiaohong”、”xiaolan”: 元素内容
例子1:定义数组,并且打印数组元素
[[email protected] ~]# awk ‘BEGIN{a[0]="xiaohong";a[1]="xiaolan";print a[0]}‘
xiaohong
[[email protected] ~]# awk ‘BEGIN{a[0]="xiaohong";a[1]="xiaolan";print a[1]}‘
Xiaolan
例子2:打印出所有元素的下标
[[email protected] ~]# awk ‘BEGIN{a[0]="xiaohong";a[1]="xiaolan";for (i in a)print i;}‘
0
1
解释:将a定义为循环中的取值列表。从数组中取出的是数组的所有元素的下标
例子3:我们将/etc/passwd/ 里边的第一类定义成数组
[[email protected] ~]#:awk -F: ‘{{a[NR]=$1;}{print NR,a[NR];}}‘ /etc/passwd
例子4:利用数组统计每一个IP的访问量
[[email protected] ~]# cat a
192.168.3.1
192.168.3.2
192.168.3.3
192.168.3.4
192.168.3.5
192.168.3.6
192.168.3.7
192.168.3.1
192.168.3.2
192.168.3.3
192.168.3.3
192.168.3.3
192.168.3.2
192.168.3.3
192.168.3.6
192.168.3.6
192.168.3.6
192.168.3.3
192.168.3.2
192.168.3.2
解决办法1:
[[email protected] ~]# sort a |uniq -c | sort -nr
6 192.168.3.3
5 192.168.3.2
4 192.168.3.6
2 192.168.3.1
1 192.168.3.7
1 192.168.3.5
1 192.168.3.4
解决办法2:
[[email protected] ~]# awk ‘{array[$1]++} END {for(key in array) print array[key],key}‘ a |sort -k 2 -nr
6 192.168.3.3
5 192.168.3.2
4 192.168.3.6
2 192.168.3.1
1 192.168.3.7
1 192.168.3.5
1 192.168.3.4
那我们再来说说上边例子中的array[$1]++
(1)Awk在读取第一行的时候,会读取这个数组,此时的数组是这样的:a[192.168.3.1]++
(2)此时a[192.168.3.1]的值是未定义的。
但是由于后边有运算符号++。Awk会将数字0自动赋值给a[192.168.3.1]。然后在做++运算
(3)此时a[192.168.3.1]做++ ,也就是0+1得到的值为1
(4)那么在读第二个192.168.3.1时,此时a[192.168.3.1]的值已经经过上次运算为1.此时在做一次运算。也就是1+1 现在a[192.168.3.1]的值为2。
(5)总结,最后的值是多少,也就意味着,192.168.3.1运算了多少次,也意味着192.168.3.1出现了多少次。
执行过程就如下:
[[email protected] ~]# awk ‘{a[$1]++;print a[$1]}‘ a
1
1
1
1
1
1
1
2
2
2
3
4
3
5
2
3
4
6
4
5
其实这与let i++ 是同理
[[email protected] ~]# i=0
[[email protected] ~]# let i++
[[email protected] ~]# echo $i
1
[[email protected] ~]# let i++
[[email protected] ~]# echo $i
2
[[email protected] ~]# let i++
[[email protected] ~]# echo $i
3
例子5:解释一下awk解决去重问题
[[email protected] ~]# awk ‘! a[$1]++‘ a
192.168.3.1
192.168.3.2
192.168.3.3
192.168.3.4
192.168.3.5
192.168.3.6
192.168.3.7
其实要解释这个问题,只需要弄清楚awk中的“真”与“假”。
在awk中,以下3种情况是“假”,其他情况都为“真”
1) 数字 0
2) 空字符串
3) 未定义的值
[[email protected] ~]# awk ‘BEGIN{a=0;if(a) print "true";else print "false"}‘
False
[[email protected] ~]# awk ‘BEGIN{a="";if(a) print "true";else print "false"}‘
False
[[email protected] ~]# awk ‘BEGIN{if(a) print "true";else print "false"}‘
False
以上的个例子说明了只要a的值为数字0、空字符串、未定义的值都为假,也就是条件都不成立
以上是关于awk数组的主要内容,如果未能解决你的问题,请参考以下文章