You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Perl脚本实现gnmap文件按主机聚合开放端口输出

修改Perl脚本实现主机IP+聚合端口输出

修改后的完整脚本

perl -ne '
    BEGIN { %host_ports = (); $current_host = ""; }
    if (/^Host: (\S+)/) {
        if ($current_host ne "") {
            print "$current_host;" . join(";", @{$host_ports{$current_host}}) . "\n";
            delete $host_ports{$current_host};
        }
        $current_host = $1;
        $host_ports{$current_host} = [] unless exists $host_ports{$current_host};
    }
    while (m/(\d+)\/open/g) {
        push @{$host_ports{$current_host}}, $1;
    }
    END {
        if ($current_host ne "") {
            print "$current_host;" . join(";", @{$host_ports{$current_host}}) . "\n";
        }
    }
' < nmap.out

调整分隔符(可选)

如果需要和你给出的例子完全一致(端口用逗号分隔),只需把脚本中两处join(";", ...)改成join(",", ...),修改后输出格式为:
IP_A;port1,port2,port3...

修改思路拆解

  • 用哈希存储数据:创建哈希%host_ports,以主机IP为键,对应的值是存储该主机所有开放端口的数组,实现“一个主机对应多个端口”的关联存储。
  • 切换主机时输出上一个主机结果:每次匹配到新的Host: IP行时,先检查是否有未输出的上一个主机数据,如果有就按格式打印,再清空旧数据,避免重复输出。
  • 收集当前主机的端口:每匹配到一个开放端口,就把端口号添加到当前主机对应的端口数组中,不立即输出,而是先攒起来。
  • 脚本结束前输出最后一个主机:因为最后一个主机没有后续的新主机触发输出,所以在脚本末尾的END块中单独处理,确保所有数据都被输出。

内容的提问来源于stack exchange,提问作者Simulacrum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:20:17