awk数组的两条实用技巧(去重,统计)

作者: My熊猫眼 | 来源:发表于2019-08-18 10:01 被阅读11次

    说到数组,一般下标都是从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到了就多多使用吧,相信会节省你不少功夫的哦!

    本文原创,转载请注明出处.

    相关文章

      网友评论

        本文标题:awk数组的两条实用技巧(去重,统计)

        本文链接:https://www.haomeiwen.com/subject/zealsctx.html