DHCP ホスト登録レコードをキャプチャするための正規表現は何でしょうか?

DHCP ホスト登録レコードをキャプチャするための正規表現は何でしょうか?

DHCPホスト登録レコードをキャプチャするための正規表現が必要です

私は解析する必要があるdhcpd.confファイルにすべてのホスト予約を書き込み、可能であればそれをファイルまたはBash配列にキャプチャします。つまり、ホスト予約が次のように定義されている場合、

    host Service-Ethernet {
        hardware ethernet 11:11:11:11:11:11;
        fixed-address 192.168.0.3;
        option host-name "service";
    }

    host Service-Wifi {
        hardware ethernet 22:22:22:22:22:22;
        fixed-address 192.168.0.4;
    }

    host Test {
        hardware ethernet 33:33:33:33:33:33;
        fixed-address 192.168.0.5
        option host-name "test";
    }

ファイルまたは Bash 配列に出力します...

11:11:11:11:11:11, 192.168.0.3, service
22:22:22:22:22:22. 192.168.0.4,
, 192.168.0.5, test

3 つのパラメータのうち 1 つが欠落している場合は、空白のままにします。

式を 1 行ずつ適用する必要がある場合でも、それは許容されます。もちろん、構成ファイルを 1 行ずつ読み取る Bash スクリプトを使用して式をラップすることもできます。

答え1

としてparse_dhcp.awk

#!/usr/bin/env awk -f

function output() {
    printf "%s, %s, %s\n", hw, fa, opt
}

$1 == "host" {
    if (NR > 1) output()
    hw = fa = opt = ""
    next
}

{sub(/;$/, "")}
$1 == "hardware"      {hw = $NF}
$1 == "fixed-address" {fa = $NF}
$1 == "option"        {opt = $NF; gsub(/"/, "", opt)}

END {output()}

それから

awk -f parse_dhcp.awk dhcp.conf

さらにわかりにくいのは、そのファイルは有効な Tcl 構文であるため、ファイルを Tcl スクリプトとして評価できるように DSL を記述する必要があるということです。

#!/usr/bin/env tclsh

proc host {name data} {
    global vars
    array set vars {hardware "" fixed-address "" option ""}
    eval $data
    puts "$vars(hardware), $vars(fixed-address), $vars(option)"
}

proc unknown {cmd args} {
    global vars
    set vars($cmd) [lindex $args end]
}

set file [lindex $argv 0]
source $file

そして

tclsh parse_dhcp.tcl dhcp.conf

答え2

次の Perl の 1 行は、ほぼ必要なものを出力するようです。

perl -ane 'print $F[-1] =~ s/[";]//gr unless /[{}]/; print /^$/ ? "\n" : " "'

しかし、入力には完全にスキップしたいセクションが含まれている可能性があるので、さらに調整が必要です。

perl -ane 'if (/host/ .. /}/) {
               print $F[-1] =~ s/[";]//gr unless /[{}]/;
               print /}/ ? "\n" : " "
           }'

つまり

  • hostと を含む行の間にある場合は}入力を処理し、それ以外の場合はスキップします。
  • 現在の行に中括弧が含まれていない場合は、セミコロンと二重引用符を削除した最後の単語を出力します。
  • 行に閉じ中括弧が含まれている場合は改行を出力し、含まれていない場合はスペースを出力します。

答え3

そこで、人々がさまざまな独創的な解決策で回答しているのを見ました。正規表現愛好家として、私は必要に応じて正規表現で回答しようとしました。

ホスト テスト ステートメントにセミコロンがないため、サンプルは整形式のドキュメントではないことが判明しました。

ご覧のとおり、そこには構文エラーがあり、ステートメント host Test 内の 2 つの完全に妥当な式、fixed-address と option が無効になっています。

整形式のドキュメントを操作したい場合で、この例がエラーだった場合は、次のように使用できます。

host\s+[\w\-]+\s*\{(\s+hardware\s+ethernet\s+(([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2});)?(\s*fixed-address\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3});)?(\s*option\s+host-name\s+"(.*?)";)?\s*\}

置換文字列は次のようになります。

\2, \5, \7

一方、セミコロンが欠落している文書に対処する必要がある場合は、オプションにする必要がある各セミコロンの後に疑問符を付けてください。

オプションをテストするには出典:https://regex101.com/

間違いがあったら教えてください。頑張ってください。

関連情報