Bash 从nmap中提取特定模式

Bash 从nmap中提取特定模式,bash,awk,sed,grep,cut,Bash,Awk,Sed,Grep,Cut,假设我有这样的nmap结果: # Nmap 6.40 scan initiated Sat Jun 14 10:14:35 2014 as: nmap ... Nmap scan report for x.x.x.x. Host is up (0.21s latency). PORT STATE SERVICE 23/tcp open telnet | telnet-brute: |_ No accounts found Nmap scan report for y.y.y.y Ho

假设我有这样的nmap结果:

# Nmap 6.40 scan initiated Sat Jun 14 10:14:35 2014 as: nmap ...
Nmap scan report for x.x.x.x.
Host is up (0.21s latency).
PORT   STATE SERVICE
23/tcp open  telnet
| telnet-brute: 
|_  No accounts found

Nmap scan report for y.y.y.y
Host is up (0.24s latency).
PORT   STATE SERVICE
23/tcp open  telnet

Nmap scan report for z.z.z.z
Host is up (0.22s latency).
PORT   STATE SERVICE
23/tcp open  telnet
|_telnet-brute: var1 - <blank>

Nmap scan report for w.w.w.w
Host is up (0.36s latency).
PORT   STATE SERVICE
23/tcp open  telnet
|_telnet-brute: var2 - var3

Nmap scan report for h.h.h.h
Host is up (0.22s latency).
PORT   STATE SERVICE
23/tcp open  telnet
| telnet-brute: 
|_  No accounts found

Nmap scan report for f.f.f.f
Host is up (0.22s latency).
PORT   STATE SERVICE
23/tcp open  telnet
|_telnet-brute: var4 - <blank>

Nmap scan report for b.b.b.b
Host is up (0.23s latency).
PORT   STATE SERVICE
23/tcp open  telnet
| telnet-brute: 
|_  No accounts found

   
    .
    .
    .

Nmap scan report for a.a.a.a
Host is up (0.22s latency).
PORT   STATE SERVICE
23/tcp open  telnet

# Nmap done at Sun Jun 15 10:20:45 2014 -- 262144 IP addresses (91295 hosts up) scanned in 86769.85 seconds
我想知道,如果有,那就不要显示出来。(最好使用
sed

更新 我尝试的是:

sed -nr '/^Nmap.* /{s///;h};/|_telnet-brute/{n;H;g;s/\n\|\s*/ /;/:/p}' file

谢谢

您的数据不一致(您有
|u telnet
|telnet
),但这可能会给您带来一些:

nmap ..... | awk -v RS="" '{print $5,$18,$20}'

但换言之,在进一步处理之前调整输出。

您的数据不一致(您有
|u telnet
|telnet
),但这可能会给您一些:

nmap ..... | awk -v RS="" '{print $5,$18,$20}'

但也就是说,在进一步处理之前调整输出。

以及通过
grep
使用
Perl regex
选项的输出

$ grep -oP "\w\.\w\.\w\.\w|(?<=brute:).*" file | paste - -
x.x.x.x  var1 - <blank>
y.y.y.y  var2 - var3
z.z.z.z  

$grep-oP“\w\.\w\.\w\.\w |”(?和通过
grep
使用
Perl regex
选项

$ grep -oP "\w\.\w\.\w\.\w|(?<=brute:).*" file | paste - -
x.x.x.x  var1 - <blank>
y.y.y.y  var2 - var3
z.z.z.z  

$grep-oP“\w\.\w\.\w\.\w |”(?我会在Perl中这样做:

$ perl -lne '/for (.+)/; $i=$1; (@f = /var./g) && print "$i @f"' file 
z.z.z.z var1
w.w.w.w var2 var3
f.f.f.f var4
解释
  • perl-lne
    -ne
    表示“逐行读取输入文件”(
    -n
    ),并应用作为
    -e
    ”给出的脚本。
    -l
    为每个
    打印
    调用添加一个新行(并删除尾随的新行)
  • /for(+)/;$i=$1;
    :匹配单词
    for
    ,后跟空格并捕获(括号就是这样做的)行尾的所有内容。捕获的模式(
    $1
    )保存为
    $i
  • @f=/var./g
    :保存数组
    @f
    中出现的所有
    var
    和多个字符。如果
    var
    后面可以有>1个字符,请将其更改为
    @f=/var\w*/g
  • &打印“$i@f”
    :如果上一次匹配成功,则打印
    $i
    (IP)和
    @f
    的内容

    • 我会用Perl来做这件事:

      $ perl -lne '/for (.+)/; $i=$1; (@f = /var./g) && print "$i @f"' file 
      z.z.z.z var1
      w.w.w.w var2 var3
      f.f.f.f var4
      
      解释
      • perl-lne
        -ne
        表示“逐行读取输入文件”(
        -n
        ),并应用作为
        -e
        ”给出的脚本。
        -l
        为每个
        打印
        调用添加一个新行(并删除尾随的新行)
      • /for(+)/;$i=$1;
        :匹配单词
        for
        ,后跟空格并捕获(括号就是这样做的)行尾的所有内容。捕获的模式(
        $1
        )保存为
        $i
      • @f=/var./g
        :保存数组
        @f
        中出现的所有
        var
        和多个字符。如果
        var
        后面可以有>1个字符,请将其更改为
        @f=/var\w*/g
      • &打印“$i@f”
        :如果上一次匹配成功,则打印
        $i
        (IP)和
        @f
        的内容

      nmap支持不同的处理方式。您可能会发现更适合您的处理方式。谢谢@Gumbo的帮助…但我想用文本编辑器实现这一点…nmap支持不同的处理方式。您可能会发现更适合您的处理方式。谢谢@Gumbo的帮助…但我想用文本编辑器实现这一点…我只使用
      |u telnet
      linesI a我只使用
      |u telnet
      linesHow来拒绝像
      z.z.z
      这样的行?如果您不想使用第三行
      grep-oP”\w\。\w\。\w\。\w|(?谢谢…但这并没有显示ip…我不知道根据您的示例发布了什么。发布nmap日志文件内容,我将为您尝试。关于ip,您的正则表达式应该是
      [0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}
      如何拒绝像
      z.z.z.z
      这样的行?如果你不想要第三行
      grep-oP“\w\.\w\.\w\.\w |”(?谢谢你…但这不是给我显示ip…我不知道根据你的示例发布了什么。发布nmap日志文件内容,我会为你尝试。关于ip,你的正则表达式应该是
      [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
      $ perl -lne '/for (.+)/; $i=$1; (@f = /var./g) && print "$i @f"' file 
      z.z.z.z var1
      w.w.w.w var2 var3
      f.f.f.f var4