我想使用 grep 从 airodump-ng 中提取转储文件中的 essid。我想要提取的部分如下所示:
<SSID first-time="Wed Feb 25 07:06:57 2015" last-time="Wed Feb 25 07:14:23 2015">
<type>Beacon</type>
<max-rate>54.000000</max-rate>
<packets>3371</packets>
<beaconrate>10</beaconrate>
<encryption>WPA2 AES-CCM </encryption>
<essid cloaked="false">WLAN-123651234</essid>
</SSID>
<BSSID>24:65:11:3A:68:02</BSSID>
<manuf>Unknown</manuf>
<channel>1</channel>
<freqmhz>2412 23193</freqmhz>
<maxseenrate>54000</maxseenrate>
<packets>
所以我想提取第 7 行中的 essid“WLAN-123651234”。我该如何执行此操作? essid 有多长并不重要,因为我想不仅对那个 essid 使用这种方式,所以需要像这样提取它:
grep >....< dumpfile.netxml
Output: WLAN-1234651234
答案1
当 GNUgrep
链接到最新版本的 PCRE 库(Perl 兼容正则表达式)时,您可以尝试:
$ grep -oP '<essid\b[^<>]*>\K[^<>]*(?=</essid>)' file
WLAN-123651234
这将提取标签的内容essid
。
解释:
<essid
与字符串完全匹配<essid
\b
称为单词边界,它在单词字符和非单词字符之间进行匹配,反之亦然。[^<>]*
否定字符类,与任何字符匹配,但不匹配<
或>
零次或多次。\K
在最后打印时丢弃所有先前匹配的字符。[^<>]*
否定字符类,与任何字符匹配,但不匹配<
或>
零次或多次。(?=</essid>)
正向先行断言,断言匹配项后面必须跟有字符串</essid>
。
答案2
为什么使用 grep 从 xml 文件中获取内容?您正在使用 grep,所以您可能使用的是 Linux 或 BSD 系统,那么为什么不直接从命令行使用 xpath 呢?
xpath -q -e "SSID/essid/text()" /path/to/file.xml
将精确地执行您想要的操作,并且比正则表达式要少得多的麻烦,正则表达式在从 XML 中获取内容时往往相当脆弱。
如果未安装,您的包管理器应该能够处理它。在 Ubuntu 上,相关包称为libxml-xpath-perl。
答案3
使用 GNU grep:
grep -oP 'essid.*>\K.*(?=<)' file
输出:
无线局域网-123651234
答案4
听起来像是破纪录的风险 -XML
是一种数据结构,可以对该数据结构执行多种操作,这些操作对于 XML 规范而言是有效的,但就正则表达式而言则完全破坏了它。例如行格式、缩进、标签换行等。
因此,我强烈建议任何人在处理 XML 时使用 XML 解析器。它们旨在处理 XML 的嵌套和处理,忽略格式,但仍区分重要语义,如标签、嵌套和属性。
所以我会这样处理你的问题:
#!/usr/local/bin/perl
use strict;
use warnings;
use XML::Twig;
XML::Twig->new(
'twig_handlers' => {
'essid' => sub { print $_ ->text }
}
)->parse( <> );
这会吐出:
WLAN-123651234
如果您不想拥有单独的脚本文件(但我认为您应该这样做,因为它通常更利于清晰度和维护),您可以进一步减少:
perl -MXML::Twig -e 'XML::Twig->new( twig_handlers => { essid => sub { print $_ -> text,"\n" } } ) -> parse ( <> );'
对于奖励积分 - 您可以使用 xml xpath 表达式,例如:
essid[@cloaked="false"]
打印子集。
也很有用 -XML::Twig
模块附带了非常有用的xml_grep
实用程序,...完全可以满足您的需求,因为它会 grep xml。