前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >awk数组的两条实用技巧(去重,统计)

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

作者头像
qsjs
发布2020-06-09 10:35:00
1.4K0
发布2020-06-09 10:35:00
举报

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

代码语言:javascript
复制
[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数组的一个特点;

代码语言:javascript
复制
如果我们把$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数组的这些特征,我们可以进行统计操作,以下为两个统计的例子,相信你看完下面的例子,一定能够举一反三的,比如统计 当前的网络连接数等之类的常见问题:

代码语言:javascript
复制
统计一行中,每一列出现的次数: 
[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,所以,利用这一点进行查重操作,看下面的例子:

代码语言:javascript
复制
[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到了就多多使用吧,相信会节省你不少功夫的哦! 本文原创,转载请注明出处.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档