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数组的两条实用技巧(去重,统计)

    说到数组,一般下标都是从0开始,然后递增;而awk的数组的下标可以是 任意内容,比如下面的例子: 从上面的例子可以...

  • awk 命令使用方法

    1. awk 擅长功能 awk 擅长对列进行操作/进行数据信息的统计(数组) awk 基本使用(高级使用-shel...

  • awk数组、文件去重、比较

    https://www.jianshu.com/p/64952ccbf733 https://blog.csdn....

  • awk巧妙去重

    在使用 awk 取出想要的初步结果之后, 对结果去重有个很有趣的办法。 因为awk中对数组的要求不是很严格,居然...

  • 【技术案例】跟老男孩学运维-awk项目案例

    一个awk数组应用案例 [TOC] 0.技术点: awk awk数组 awk判断 awk数组赋值 awk函数spl...

  • Tcp知识整理一

    Linux TCP不同状态的连接数统计 这两条常见指令netstat -tan |grep ^tcp |awk '...

  • 【awk】用awk去重

    展示第一列 根据第一列去重,并展示第一列 根据第一列去重,并展示所有列 打印你最常用的命令

  • Array集结号

    实现数组去重的几种方法 数组去重一 数组去重二 利用数组indexof+push实现数组去重 数组去重三 利用对象...

  • 数组去重

    统计数组 arr[1, 2, 3, 4, 2] 中2出现的次数 数组去重:方法1 → 返回 ["m...

  • awk文本去重

    http://www.letuknowit.com/topics/20120401/use-awk-remove-...

网友评论

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

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