AWK數組數組
一.數組格式spa
數組是一個包含一系列元素的表.awk
格式以下:循環
abc[1]=」xiaohong」統計
abc[2]=」xiaolan」總結
解釋:sort
abc :爲數組名稱tab
[1]、[2]:爲數組元素下標,能夠理解爲數組的第1個元素、數組的第2個元素co
」xiaohong」、」xiaolan」: 元素內容let
例子1:定義數組,而且打印數組元素
[root@tab0 ~]# awk 'BEGIN{a[0]="xiaohong";a[1]="xiaolan";print a[0]}'
xiaohong
[root@tab0 ~]# awk 'BEGIN{a[0]="xiaohong";a[1]="xiaolan";print a[1]}'
Xiaolan
例子2:打印出全部元素的下標
[root@tab0 ~]# awk 'BEGIN{a[0]="xiaohong";a[1]="xiaolan";for (i in a)print i;}'
0
1
解釋:將a定義爲循環中的取值列表。從數組中取出的是數組的全部元素的下標
例子3:咱們將/etc/passwd/ 裏邊的第一類定義成數組
[root@localhost ~]#:awk -F: '{{a[NR]=$1;}{print NR,a[NR];}}' /etc/passwd
例子4:利用數組統計每個IP的訪問量
[root@tab0 ~]# 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:
[root@tab0 ~]# 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:
[root@tab0 ~]# 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出現了多少次。
執行過程就以下:
[root@tab0 ~]# 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++ 是同理
[root@tab0 ~]# i=0
[root@tab0 ~]# let i++
[root@tab0 ~]# echo $i
1
[root@tab0 ~]# let i++
[root@tab0 ~]# echo $i
2
[root@tab0 ~]# let i++
[root@tab0 ~]# echo $i
3