使用 awk 仅打印 IP 和开放端口字段

使用 awk 仅打印 IP 和开放端口字段

我只想打印给定 gnmap 文件中的 IP 地址和开放端口字段。

主机:123.123.123.123 () 端口:80/open/tcp//http?///、443/open/tcp//https?///、8083/close/tcp//us-srv///、65001 /close/tcp///// 忽略状态:已过滤 (65531) 序列索引:262 IP ID 序列:随机
主机:123.123.123.124 () 端口:80/open/tcp//http?///、443/open/tcp//https?///、10443/open/tcp//https///、65001/close /tcp///// 忽略状态:已过滤 (65531) 序列索引:262 IP ID 序列:随机
主机:123.123.123.125 () 端口:80/open/tcp//http?///、443/open/tcp//https?///、8083/close/tcp//us-srv///、8445 /open/tcp//https///、65001/close/tcp///// 忽略状态:已过滤 (65531) 序列索引:262 IP ID 序列:随机
主机:123.123.123.126 () 端口:1337/open/tcp//https?///、8083/close/tcp//us-srv///、65001/close/tcp///// 忽略状态:已过滤(65531) 序列索引:262 IP ID 序列:随机

预期输出是

123.123.123.123 80/open/tcp//http?///, 443/open/tcp//https?///
123.123.123.124 80/open/tcp//http?///、443/open/tcp//https?///、10443/open/tcp//https///
123.123.123.125 80/open/tcp//http?///, 443/open/tcp//https?///

我已经尝试过许多不同的命令,其中之一是以下命令。

cat targets_osdetection.gnmap | awk '/open/{print $2 " " $5 " "$6 " " $7}'

但它只打印 $Number 字段对应的字段,并且由于每个 IP 可能不具有相同数量的开放端口,因此该命令效率不高。

有人可以为此提供 awk 解决方案吗?

答案1

awk '/\/open\//{
  l=$2
  for (i=3;i<=NF;++i) {
    if ($i~/\/open\//) l=l" "$i;
  };
  print l
 }'

解释:

如果/open/匹配该行:

  1. 使用 IP ( $2)创建变量
  2. 循环遍历字段$3-如果匹配,NF则将字段添加到变量中。/open/
  3. 打印变量。

答案2

由于您有静态文件格式sed替换也可以完成这项工作:

sed -E 's/(Host:|Ports:|\(\)) +|[^ ]+closed[^ ]+| +Ignored State:.*//g' targets_osdetection.gnmap

输出:

123.123.123.123 80/open/tcp//http?///, 443/open/tcp//https?///,  
123.123.123.124 80/open/tcp//http?///, 443/open/tcp//https?///, 10443/open/tcp//https///, 
123.123.123.125 80/open/tcp//http?///, 443/open/tcp//https?///,  8445/open/tcp//https///, 
123.123.123.126 1337/open/tcp//https?///,  

相关内容