【问题标题】:Extracting specific pattern from nmap从 nmap 中提取特定模式
【发布时间】:2014-08-05 07:49:03
【问题描述】:

想象一下我有这样的 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

我怎样才能得到这样的结果:

z.z.z.z  var1  
w.w.w.w  var2  var3
f.f.f.f  var4

我想要如果没有显示它。 (最好使用sed

更新

我尝试的是:

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

谢谢

【问题讨论】:

标签: bash awk sed grep cut


【解决方案1】:

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

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

但正如其他人所说,在更多处理之前调整你的输出。

【讨论】:

  • 我只使用|_telnet
【解决方案2】:

还有一个通过grepPerl-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  

更新:

$ awk -v RS="" '{print $5,$18,$20}' file | awk '$2~/var/ {print}'
z.z.z.z var1 <blank>
w.w.w.w var2 var3
f.f.f.f var4 <blank>

如果你想再次删除&lt;blank&gt; dtring 然后运行,

$ awk -v RS="" '{print $5,$18,$20}' file | awk '$2~/var/ {gsub (/<blank>/,""); print}'
z.z.z.z var1 
w.w.w.w var2 var3
f.f.f.f var4 

您可以在单个 awk 命令中执行此操作,

$ awk -v RS="" '$18~/var/ {gsub (/<blank>/,""); print $5,$18,$20}' file
z.z.z.z var1 
w.w.w.w var2 var3
f.f.f.f var4 

【讨论】:

  • 如何拒绝z.z.z.z 之类的行?
  • 如果不想要第三行就试试这个grep -oP "\w\.\w\.\w\.\w|(?&lt;=brute:).*" file | paste - - | awk '$2==""{next;}1'
  • 谢谢...但这并没有显示 ips...我不知道为什么
  • 我根据您的示例发布。发布 nmap 日志文件内容,我会为您尝试。关于ip,你的正则表达式应该是[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
【解决方案3】:

我会在 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 为每个 print 调用添加一个换行符(并删除尾随的换行符)。
  • /for (.+)/; $i=$1; :匹配单词for 后跟一个空格并捕获(这就是括号的作用)到行尾的所有内容。捕获的图案 ($1) 保存为$i
  • @f = /var./g :保存所有出现的var 和数组@f 中的另外一个字符。如果var 后面可以有>1 个字符,请将其更改为@f = /var\w*/g
  • &amp;&amp; print "$i @f" :如果上一次匹配成功,则打印$i(IP)和@f的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 2013-05-27
    相关资源
    最近更新 更多