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

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

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>

おすすめ記事