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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:31:02