说到数组,一般下标都是从0开始,然后递增;而awk的数组的下标可以是 任意内容,比如下面的例子:
[root@localhost ~]# netstat -antp | tail -n1
tcp6 0 0 ::1:25 :::* LISTEN 1202/master
[root@localhost ~]# netstat -antp | tail -n1 | awk '{print(a[0])}'
[root@localhost ~]# netstat -antp | tail -n1 | awk '{print(a[$1])}'
[root@localhost ~]# netstat -antp | tail -n1 | awk '{print(a[$NF])}'
[root@localhost ~]# netstat -antp | tail -n1 | awk '{print(a["abcd"])}'
[root@localhost ~]#
从上面的例子可以看到几乎任何数据都可以做数组a的下标: 字符串,整数,变量...... ,但是我们也发现一个问题:怎么数组元素的值都是0啊?
没错,数组元素的初始值都是0,这也是awk数组的一个特点;
如果我们把$1到$NF分别作为同一个数组不同元素的下标,然后用for语句访问这个数组的名字,输出的结果是什么呢?
[root@localhost ~]# netstat -antp | tail -n1
tcp6 0 0 ::1:25 :::* LISTEN 1202/master
[root@localhost ~]# netstat -antp |tail -n1 |awk '{for(i=1;i<=NF;i++)a[$i];for(j in a)print j}'
LISTEN
:::*
tcp6
1202/master
::1:25
0
[root@localhost ~]#
**从这里可以看到,当遍历数组的时候,输出的是数组的下标;**
从上面的测试,我们知道了awk数组的如下特点:
A. 数组的下标可以为 任意值;
B. 数组元素的初始值总是为0;
C. 遍历数组名称时候,获得的数组的下标值;
利用awk数组的这些特征,我们可以进行统计操作,以下为两个统计的例子,相信你看完下面的例子,一定能够举一反三的,比如统计 当前的网络连接数等之类的常见问题:
统计一行中,每一列出现的次数:
[root@localhost ~]# netstat -antp | tail -n1
tcp6 0 0 ::1:25 :::* LISTEN 1202/master
[root@localhost ~]# netstat -antp |tail -n1 |awk '{for(i=1;i<=NF;i++)++a[$i];for(j in a)print j,a[j]}'
LISTEN 1
:::* 1
tcp6 1 #表示值为tcp6的列出现了1次
1202/master 1
::1:25 1
0 2 #表示值为0的列出现了2次
[root@localhost ~]#
#对系统中归属于同一个进程的监听状态数量进行统计:
[root@localhost ~]# netstat -antp | grep -i listen
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 690/rpcbind
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 964/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1202/master
tcp6 0 0 :::3306 :::* LISTEN 1038/mysqld
tcp6 0 0 :::111 :::* LISTEN 690/rpcbind
tcp6 0 0 :::22 :::* LISTEN 964/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1202/master
[root@localhost ~]# netstat -antp | grep -i listen | tr / " " | awk '{++a[$(NF-1)]};END{for(i in a)print i,a[i]}'
1202 2 #表示属于进程pid=1202的listen状态的数量为2
964 2
1038 1 #表示属于进程pid=1038的listen状态的数量为1
690 2
[root@localhost ~]#
awk的数组除了用于统计外,还可以用于查重操作,通过前面的例子我们已经知道:awk数组元素的值初始总是为0,所以,利用这一点进行查重操作,看下面的例子:
[root@localhost ~]# netstat -antp | grep -i listen
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 690/rpcbind
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 964/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1202/master
tcp6 0 0 :::3306 :::* LISTEN 1038/mysqld
tcp6 0 0 :::111 :::* LISTEN 690/rpcbind
tcp6 0 0 :::22 :::* LISTEN 964/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1202/master
[root@localhost ~]# netstat -antp | grep -i listen | tr / " " | awk '{if(!(a[$(NF-1)]++))print $(NF-1)}' #剔除重复的
690
964
1202
1038
[root@localhost ~]# netstat -antp | grep -i listen | tr / " " | awk '{if((a[$(NF-1)]++))print $(NF-1)}' #输出重复的;
690
964
1202
END!
以上两中方法:查重以及统计在运维的工作中经常用到的哦,如果get到了就多多使用吧,相信会节省你不少功夫的哦!
本文原创,转载请注明出处.
网友评论