如何只提取一行的一部分?

如何只提取一行的一部分?

我想使用 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。

相关内容