【问题标题】:Extracting IP addresses with at least 3 conversation in *Nix environment在 *Nix 环境中提取至少 3 个会话的 IP 地址
【发布时间】:2011-06-17 12:03:54
【问题描述】:

如图所示,我们的子网中有一个 IP 地址列表(请注意 128.3.* 和 131.243.*)。我们更喜欢在 Perl 中进行,任何其他好的想法都比在 *nix 环境中更受欢迎。

图片格式为:

目标 IP(已排序)- Dest_Port - 源IP- Source_Port

空格用作分隔符。

我们是手动完成的,但我们知道我们有大量文件并希望自动执行此过程。

问题是我们需要得到 目标 IP 地址(不在我们的子网中,不是 128.3.* 和 131.243.*) 与至少 3 个不同的 IP 地址(来源)在我们的子网内 (128.3.* 和 131.243.*)。

例如,117.72.15.207 与我们的子网中的至少 3 个不同源地址(131.243.92.10、131.243.92.117 和 131.243.92.191)进行通信(不是子网 ip)。请注意,它与 131.243.92.117 通信的不止一个具有不同的源端口地址,因此它只会在输出中计算一个源地址。我放了一颗星来指定条件。 我们需要满足此条件的 IP 对列表

59.69.194.12 80 131.243.93.74 4492
59.79.35.247 80 131.243.94.123 1307
59.100.23.87 80 131.243.92.72 45577
*117.72.15.207 80 *131.243.92.10 451 
*117.72.15.207 80 *131.243.92.117 21071
117.72.15.207 80 131.243.92.117 21072
117.72.15.207 80 131.243.92.117 21073
*117.72.15.207 80 *131.243.92.191 9248

输出将是:

117.72.15.207 80 131.243.92.10 451 
117.72.15.207 80 131.243.92.117 21071
117.72.15.207 80 131.243.92.191 9248

如果有不清楚的地方请评论。谢谢...

【问题讨论】:

  • 所以您想在 Perl 中执行此操作...到目前为止您有什么?更新您的帖子以包含代码并指定您不理解的内容。否则问题可能会被关闭。
  • @Jim Garrison,我们提取了 IP 地址和端口号并从跟踪中对其进行了排序,我对 perl 不了解,不确定这是否可以通过其他方式完成,所以我在这里发布。
  • 一般来说 SO 是为了提出具体的问题,而不是让别人为你写代码。您可能会发现有人会花时间为您编写完整的解决方案,但不要屏住呼吸。
  • @Jim Garrison,我理解你的观点,我不是新用户。我感谢任何获得解决方案的建议,不需要成为真正的解决方案,我不想用 C++ 编写只是寻找其他方法。谢谢。

标签: perl unix awk text-processing


【解决方案1】:
#!/usr/bin/env perl

use strict;

my %ip_lookup;
while (<DATA>) {
    my ($dest_ip, $dest_port, $source_ip, $source_port) = (split ('\s+', $_));
    $ip_lookup{$dest_ip}{$source_ip} = $_ unless $ip_lookup{$dest_ip}{$source_ip};
}

for my $dest_ip (keys %ip_lookup) {
    if (scalar(keys %{$ip_lookup{$dest_ip}}) >= 3) {
        print $_ for sort values %{$ip_lookup{$dest_ip}};
    }
}

__DATA__
9.69.194.12 80 131.243.93.74 4492
59.79.35.247 80 131.243.94.123 1307
59.100.23.87 80 131.243.92.72 45577
117.72.15.207 80 131.243.92.10 451 
117.72.15.207 80 131.243.92.117 21071
117.72.15.207 80 131.243.92.117 21072
117.72.15.207 80 131.243.92.117 21073
117.72.15.207 80 131.243.92.191 9248

有几种方法在Perl中做到这一点,但我上面张贴的样本是简单的解释。

首先,它的读取文件中的每一行(我使用的是数据句柄,但它会工作与相同文件),然后分割线来获得不同的IP,端口的组合。 P>

然后,它填充了多层次的散列除非此目的地 - (的不同的端口指向你制造)之前源IP组合已经看到 P>

最后,进行排序,并通过3是否或源IP条目已经做出对于每个目的地IP打印出行,如果是这样的话检查循环。 P>

这导致输出:

117.72.15.207 80 131.243.92.10 451 
117.72.15.207 80 131.243.92.117 21071
117.72.15.207 80 131.243.92.191 9248

这是你需要什么。 P>

【讨论】:

  • 它可能需要测试的IP地址是否是内部或外部。(如在指定的问题 - 甚至认为采样数据不需要它)跨度>
  • 在问题他实际上规定的格式作为目的地IP(排序) - Dest_Port - 源IP-Source_Port。这是微不足道的测试IP的开始,以确定它是否是在和他们的子网。 SPAN>
猜你喜欢
  • 2023-03-30
  • 2015-08-24
  • 1970-01-01
  • 2011-04-22
  • 2012-04-22
  • 2018-04-20
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
相关资源
最近更新 更多