AWK數組
一.數組格式
數組是一個包含一系列元素的表.
格式如下:
abc[1]=”xiaohong”
abc[2]=”xiaolan”
解釋:
abc :為數組名稱
[1]、[2]:為數組元素下標,可以理解為數組的第1個元素、數組的第2個元素
”xiaohong”、”xiaolan”: 元素內容
例子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