Bash IPv4点状十进制表示法转换为/8或/16格式的文本处理
我有一个输入文件,其中包含ip地址列表和ip_计数(我在内部使用的一些参数)。该文件看起来有点像这样Bash IPv4点状十进制表示法转换为/8或/16格式的文本处理,bash,sed,awk,grep,Bash,Sed,Awk,Grep,我有一个输入文件,其中包含ip地址列表和ip_计数(我在内部使用的一些参数)。该文件看起来有点像这样 202.124.127.26 2135869 202.124.127.25 2111217 202.124.127.17 2058082 202.124.127.16 2014958 202.124.127.20 1949323 202.124.127.24 1933773 202.124.127.27 1932076 202.124.127.22 1886466 202.124
202.124.127.26 2135869
202.124.127.25 2111217
202.124.127.17 2058082
202.124.127.16 2014958
202.124.127.20 1949323
202.124.127.24 1933773
202.124.127.27 1932076
202.124.127.22 1886466
202.124.127.18 1882955
202.124.127.21 1803528
202.124.127.23 1786348
119.224.129.200 1776592
119.224.129.211 1639325
202.124.127.19 1479198
119.224.129.201 1145426
202.49.175.110 1133354
119.224.129.210 1119525
68.232.45.132 1085491
119.224.129.209 1015078
131.203.3.8 857951
202.162.73.4 817197
207.123.58.125 785326
202.7.6.18 762603
117.121.253.254 718022
74.125.237.120 710448
68.232.44.219 693002
202.162.73.2 671559
205.128.75.126 611301
119.161.91.17 604393
119.224.129.202 559930
8.27.241.126 528862
74.125.237.152 517516
8.254.9.254 514341
正如您所看到的,ip地址本身是未排序的。因此,我使用文件上的sort命令对ip地址进行排序,如下所示
cat address_count.txt | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n > sorted_address.txt
这给了我一个ip地址按排序顺序的输出。该文件的部分输出如下所示
4.23.63.126 15731
4.26.254.254 320705
4.27.8.254 25174
8.12.129.50 176141
8.12.223.125 11800
8.19.32.65 15854
8.19.240.53 11013
8.19.240.70 11915
8.19.240.72 31541
8.19.240.73 23304
8.20.213.28 96434
8.20.213.32 108191
8.20.213.34 170058
8.20.213.39 23512
8.20.213.41 10420
8.20.213.61 24809
8.26.195.253 28568
8.27.152.253 104446
8.27.233.125 115856
8.27.235.126 16102
8.27.235.254 25628
8.27.238.254 108485
8.27.240.125 169262
8.27.241.126 528862
8.27.241.252 197302
8.27.248.125 14926
8.254.9.254 514341
12.129.210.71 89663
15.192.45.21 20139
15.192.45.26 35265
15.193.0.148 10313
15.193.113.29 40318
15.201.49.136 14243
15.240.238.52 57163
17.250.248.95 28166
23.33.125.13 19179
23.33.125.37 17953
31.151.163.60 72709
38.99.42.37 192356
38.99.68.180 41251
38.99.68.181 10272
38.104.237.74 74012
38.108.112.103 37034
38.108.112.115 69698
38.108.112.121 92173
38.108.112.122 99230
38.112.63.238 39958
38.119.130.62 42159
46.4.28.22 19769
现在我想解析上面给出的文件,并将其转换为aaa.bbb.ccc.0/8格式和
aaa.bbb.0.0/16格式,我还想计算每个子网中ip的出现次数。我想使用bash进行此操作。我愿意使用sed或awk。如何实现这一点
比如说
8.19.240.53 11013
8.19.240.70 11915
8.19.240.72 31541
8.19.240.73 23304
8.20.213.28 96434
8.20.213.32 108191
8.20.213.34 170058
8.20.213.39 23512
8.20.213.41 10420
8.20.213.61 24809
关于输入部分应该生成8.19.240.0/8和8.20.213.0/8,对于/16域也是如此。我还想计算子网中机器的出现次数。
例如,在上面的输出中,此子网旁边的下一列中应包含计数4。它还应将已显示的计数添加到另一列中,即(11013+11915+31541+23304)
8.19.240.0/8 4(11013+11915+31541+23304)
8.20.213.0/8 6(96434+108191+170058+23512+10420+24809)
如果有人能提出一些方法来实现这一点,那就太好了。这里的主要问题是,如果没有数据包到达时的路由表,您就不知道它们最初在哪个netblock中。当然,您可以将它们放在类完整路由情况下的类完整块中,但这将为您提供一个很好的演示(当然,还有一个较短的文件) 此外,您的示例看起来有点不完整。您在8.0.0.0/8中有一组IP地址,您正在将它们聚合到类似于/24的路由中,并在最后用a/8表示它们 尽管如此,在awk中,您可以使用sub()进行文本替换(或者您可以使用index查找出现的…,或者您可以使用split在点处分割)。从这一点到“删除最后一个数字,添加字符串“0/24”,并将其用作更新IP计数和命中计数字典的键,然后删除最后两个八位字节和斜杠,替换为“0.0/16”,并执行相同的操作应该相对容易(awk中的所有数组都是关联数组,因此本质上是dicts)。无需提前排序,当您循环遍历结果时,您将以随机顺序获得密钥,但平均而言,密钥数量会减少,因此之后的排序将更便宜
我手头似乎没有awk,所以我不能给你一个代码示例。这可能适合你:
awk '{a=$1;sub(/\.[^.]*$/,"",a);ac[a]++;at[a]+=$2};END{for(x in ac)print x".0/8",ac[x],at[x]}' file
这将打印'0/8
地址以获得0/16
复制代码,即b=a;子(/\.[^.]*$/,“”,b);ba[b]+
etc等