首页 awk 数组(五)

awk 数组(五)

技术张儿 2018-9-20 0 215
标签: Linux·awk

存储一些列相同类型的元素,键/值方式存储,通过下标(键)来访问值。
awk中数组称为关联数组,不仅可以食用数字作为下标,还可以使用字符串作为下标。
数组元素的键和值存储在awk程序内部的一个表中,该表采用散列算法,因此数组元素是随机排序


1)自定义数组
[root@jz ~]# awk 'BEGIN{a[0]="test";print a[0]}'
test

2)通过NR设置记录下标,下标从1开始
[root@jz ~]# tail -n3 /etc/passwd
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@jz ~]# tail -n3 /etc/passwd|awk -F: '{a[NR]=$1}END{print a[1]}'
saslauth
[root@jz ~]# tail -n3 /etc/passwd|awk -F: '{a[NR]=$1}END{print a[2]}'
postfix
[root@jz ~]# tail -n3 /etc/passwd|awk -F: '{a[NR]=$1}END{print a[3]}'
sshd

3)通过for循环遍历数组
[root@jz ~]# tail -n5 /etc/passwd
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@jz ~]# tail -n5 /etc/passwd|awk -F: '{a[NR]=$1}END{for(v in a)print a[v],v}'
postfix 4
sshd 5
dbus 1
vcsa 2
saslauth 3

4)通过++方式作为下标
[root@jz ~]# tail -n5 /etc/passwd |awk -F: '{a[NR]=$1}END{for(i=1;i<=NR;i++)print a[i],i}'
dbus 1
vcsa 2
saslauth 3
postfix 4
sshd 5

5)使用字段作为下标

[root@jz ~]# tail -n5 /etc/passwd|awk -F: '{a[$1]=$7}END{for(v in a)print a[v],v}'
/sbin/nologin vcsa
/sbin/nologin dbus
/sbin/nologin saslauth
/sbin/nologin sshd
/sbin/nologin postfix

6)统计相同字段出现次数
[root@jz ~]# tail /etc/services |awk '{a[$1]++}END{for(v in a)print a[v],v}'
2 iqobject
2 com-bardac-dw
2 blp5
2 isnetserv
1 3gpp-cbsp
1 nimgtw

7)统计TCP连接状态
[root@jz ~]# netstat -antp|awk '/tcp/{a[$6]++}END{for(v in a)print a[v],v}'
1 ESTABLISHED
6 LISTEN

8)纸打印出现次数大于等于2的
[root@jz ~]# tail /etc/services |awk '{a[$1]++}END{for(v in a) if(a[v]>=2){print a[v],v}}'
2 iqobject
2 com-bardac-dw
2 blp5
2 isnetserv

9)去重

只打印去重的行

[root@jz ~]# tail /etc/services |awk 'a[$1]++'
isnetserv       48128/udp               # Image Systems Network Services
blp5            48129/udp               # Bloomberg locator
com-bardac-dw   48556/udp               # com-bardac-dw
iqobject        48619/udp               # iqobject

去重(当记录出现第二次就不打印)
[root@jz ~]# tail /etc/services |awk '!a[$1]++'
nimgtw          48003/udp               # Nimbus Gateway
3gpp-cbsp       48049/tcp               # 3GPP Cell Broadcast Service Protocol
isnetserv       48128/tcp               # Image Systems Network Services
blp5            48129/tcp               # Bloomberg locator
com-bardac-dw   48556/tcp               # com-bardac-dw
iqobject        48619/tcp               # iqobject

10)统计每个相同字段的某字段的总数
[root@jz ~]# tail /etc/services |awk -F'[ /]+' '{a[$1]+=$2}END{for(v in a)print v,a[v]}'
iqobject 97238
com-bardac-dw 97112
blp5 96258
isnetserv 96256
3gpp-cbsp 48049
nimgtw 48003

11)多维数组
awk 的多维数组,实际上awk并不支持多维数组,而是逻辑上模拟二位数组的访问方式,比如a[a,b]=1,使用SUBSEP(默认\034)作为分割下标字段,存储后是这样a\034b

示例

[root@jz ~]# awk 'BEGIN{a["x","y"]=123;for(v in a) print v,a[v]}'
xy 123

我们可以重新复制SUBSEP变量,改变下标默认分隔符
[root@jz ~]# awk 'BEGIN{SUBSEP=":";a["x","y"]=123;for(v in a) print v,a[v]}'
x:y 123


作者: 技术张儿 本文发布于2018-9-20 01:02:28
免责声明:本文仅代表作者个人观点。