我只想打印给定 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/
匹配该行:
- 使用 IP (
$2
)创建变量 - 循环遍历字段
$3
-如果匹配,NF
则将字段添加到变量中。/open/
- 打印变量。
答案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?///,