0

我有一个输入文件,其中包含一个 ip 地址列表和 ip_counts(我在内部使用的一些参数。)该文件看起来有点像这样。

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地址本身是未排序的。所以我使用文件上的排序命令对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

about 输入部分应该产生 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)

如果有人可以提出一些方法来实现这一点,那就太好了。

4

2 回答 2

2

这里的主要问题是,如果没有数据包到达的各个时刻的路由表,您将不知道它们最初位于哪个网络块中。当然,您可以将它们放在它们所在的类全块中,在一个类中-完整的路由情况,但所有能给你的只是一个很好的演示文稿(而且,诚然,一个更短的文件)。

此外,您的示例看起来有点损坏。您在 8.0.0.0/8 中有一堆 IP 地址,您正在将它们聚合成看起来像 /24 的路由,并在最后以 /8 呈现它们。

尽管如此,在 awk 中,您可以使用 sub() 进行文本替换(或者您可以使用 index 查找 . 的出现,或者您可以使用 split 在点处拆分)。从那个到“删除最后一个数字,添加字符串“0/24”并将其用作更新 IP 计数和命中计数字典的键,然后删除最后两个八位字节和斜线,用“0.0/16”替换并做同样的事情”(awk 中的所有数组都是关联数组,所以本质上是 dicts)。不需要提前排序,当你循环遍历结果时,你会以随机顺序获取键,但平均而言它们会更少,因此事后排序会更便宜。

我手头似乎没有 awk,所以我不能给你一个代码示例。

于 2012-06-09T06:29:27.187 回答
0

这可能对您有用:

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;sub(/\.[^.]*$/,"",b);ba[b]++,例如等。

于 2012-06-09T06:49:18.053 回答