如何用Awk与Grep过滤Nmap结果中的xxx-xx-xxx-xx格式字符串
问题描述
我正尝试用grep、awk和sed过滤Nmap扫描结果生成报告,但没法只提取出类似178-36-246-126.static.的字符串。我需要匹配xxx-xx-xxx-xx这种带连字符的格式,试过删除前几列(比如awk '{print $1,$2,$3,$6}')但会影响后续行;用grep的-A、-B参数但行数不固定;用sed也因为IP数值变化没法实现,现在有8000多行数据,急需解决方案。
附Nmap结果示例:
178-36-246-126.static.xxxxxxxxxx.com (178.36.246.126) PORT STATE SERVICE 80/tcp open http 178-36-246-134.static.xxxxxxxxxx.com (178.36.246.134) PORT STATE SERVICE 80/tcp open http 443/tcp open https 3389/tcp open ms-wbt-server 178-36-246-145.static.xxxxxxxxxx.com (178.36.246.145) PORT STATE SERVICE 80/tcp open http 443/tcp open https 178-36-246-147.static.xxxxxxxxxx.com (178.36.246.147) PORT STATE SERVICE 443/tcp open https
解决方案
1. Grep 直接匹配提取
利用正则精准定位目标格式,只输出匹配部分:
grep -oP '\d{1,3}-\d{1,3}-\d{1,3}-\d{1,3}\.static\.' nmap_results.txt
- 参数说明:
-o:仅输出匹配到的片段,而非整行-P:启用Perl兼容正则,支持\d(匹配数字)、{1,3}(限定数字位数)- 正则逻辑:匹配四段带连字符的数字 +
.static.,完全覆盖你需要的格式
2. Awk 筛选行后提取
先过滤出包含主机名的行,再分割提取目标部分:
awk '/static\./ {split($1, arr, /\.com/); print arr[1] "."}' nmap_results.txt
- 逻辑说明:
/static\./:只处理包含.static.的行(自动排除PORT、服务信息行)split($1, arr, /\.com/):把第一列的主机名按.com分割,第一部分就是xxx-xx-xxx-xx.static- 末尾补
.得到你需要的xxx-xx-xxx-xx.static.格式
3. Sed 替换提取
用替换规则保留目标内容,删除其他无关部分:
sed -n 's/^\([0-9]*-[0-9]*-[0-9]*-[0-9]*\.static\.\).*/\1/p' nmap_results.txt
- 参数说明:
-n:默认不输出行,仅打印匹配替换后的结果s/^\(匹配内容\).*/\1/p:捕获行首的目标格式,用捕获内容替换整行后打印
验证结果
以上命令处理示例数据后,都会输出:
178-36-246-126.static. 178-36-246-134.static. 178-36-246-145.static. 178-36-246-147.static.
内容的提问来源于stack exchange,提问作者tibor
相关产品推荐
相关产品推荐

