行の一部だけを抽出する方法は?

行の一部だけを抽出する方法は?

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

grepGNUが最新バージョンのPCREライブラリ(Perl互換正規表現)にリンクされている場合は、次のことを試すことができます。

$ grep -oP '<essid\b[^<>]*>\K[^<>]*(?=</essid>)' file
WLAN-123651234

これにより、タグの内容が抽出されますessid

説明する:

  • <essid文字列と正確に一致<essid

  • \b単語境界と呼ばれるこれは単語文字と単語ではない文字の間で一致し、その逆の場合も同様です。

  • [^<>]*すべての文字に一致するがゼロ回以上一致しない否定文字クラスです<>

  • \K最後に印刷すると、以前に一致した文字がすべて削除されます。

  • [^<>]*すべての文字に一致するがゼロ回以上一致しない否定文字クラスです<>

  • (?=</essid>)順方向予測アサーションは、一致の後に文字列が続くべきであるとアサーションします</essid>

答え2

xmlファイルからコンテンツを取得するためにgrepを使用するのはなぜですか? 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

出力:

無線LAN-123651234

答え4

壊れたレコードのように聞こえる危険があります。XMLXML仕様に関する限り、有効であるが正規表現に関する限り、完全に壊れる可能性があるデータ構造に対してできることがたくさんあります。たとえば、行の書式設定、インデント、ラベルの改行などがあります。

したがって、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ユーティリティが付属しています。このユーティリティはxmlをgrepするため、必要な操作を正確に実行します。

関連情報