2016-11-04 47 views
0

计数的所有端口我有一个包含在每一行的CIDR地址和端口的文件:使用AWK,与端口组CIDR,并与相应的CIDR

192.168.1.0/24 3306 
192.168.1.0/24 55982 
10.10.10.0/24 5800 
10.10.10.0/24 39690 
10.10.10.0/24 50112 
192.168.1.0/24 3308 
192.168.1.0/24 3312 
192.168.1.0/24 3316 

利用GNU awk中4.1.4(Linux系统上),最初的想法是把所有端口上通过CIDR地址分组一条线,所以这个做到了:

awk '{a[$1]=a[$1] ? a[$1]","$2 : $2} END {for (j in a) {print j" over ports: "a[j]}}' file 

192.168.1.0/24 over ports: 3306,3308,3312,3316,55982 
10.10.10.0/24 over ports: 5800,39690,50112 

我也想添加一个计数多少个端口有每个CIDR地址得到这个结果:

192.168.1.0/24 over 5 ports: 3306,3308,3312,3316,55982 
10.10.10.0/24 over 3 ports: 5800,39690,50112 

我试图把值到阵列和打印出的关键,但伯爵总是出来2.

awk '{a[$1]=a[$1] ? a[$1]","$2 : $2} {h[$1]++;} END {for (i in h) for (j in a) {print j" over "h[i]" ports: "a[j]}}' file 

192.168.1.0/24 over 2 ports: 3306,3308,3312,3316,55982 
10.10.10.0/24 over 2 ports: 5800,39690,50112 

我愿意做其他的事情除了awk的,但它是最好由于具有CIDR /端口的文件数百万行,awk速度很快。有任何想法吗?

回答

2

没有多暗淡阵列

$ awk '{a[$1]=a[$1]?a[$1] "," $2:$2; c[$1]++} 
    END{for(k in a) print k,"over " c[k] " ports:",a[k]}' file 

10.10.10.0/24 over 3 ports: 5800,39690,50112 
192.168.1.0/24 over 5 ports: 3306,55982,3308,3312,3316 
+0

这个工程非常快的文件下25MB。当文件比这个大,它开始变慢。当我使用andreatsh答案时,它适用于更大的文件,但对于较小的文件并没有太大的区别。 – RG1

2

这是我的解决方案与awk

awk '{ z[$1][++count[$1]]; s[$2]=$1; } 
     END { 
     for (i in z) 
     { 
      printf(i" over "count[i]" ports: "); 
      c=0; 
      # print ports according to the key value 
      # and the requested format, i.e. port1,port2,... 
      for (j in s) 
      if(s[j]==i) 
       # we don't want a comma at the end of the line, 
       # after the last port we put a newline 
       if (c<count[i]-1) 
       { 
        printf(j","); 
        c++; 
       } 
       else printf(j"\n") 
     } 
     } 
}' file 

,其输出:

10.10.10.0/24 over 3 ports: 5800,39690,50112 
192.168.1.0/24 over 5 ports: 3306,3308,3312,3316,55982 
1
$ awk '{cnts[$1]++; ports[$1]=($1 in ports ? ports[$1] "," : "") $2} 
     END{for (ip in ports) print ip, "over", cnts[ip], "ports:", ports[ip]}' file 
10.10.10.0/24 over 3 ports: 5800,39690,50112 
192.168.1.0/24 over 5 ports: 3306,55982,3308,3312,3316