DHCP ホスト登録履歴をキャプチャするには正規表現が必要です。
分析する必要がありますdhcpd 構成ファイル可能であれば、ファイルまたは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行ずつ適用する必要がありますが、これはまだ許可されています。もちろん、Bashスクリプトで式をラップし、構成ファイルを1行ずつ読み取ることもできます。
答え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行はあなたが望むほとんど出力をするようです:
perl -ane 'print $F[-1] =~ s/[";]//gr unless /[{}]/; print /^$/ ? "\n" : " "'
ただし、入力に完全にスキップしたい部分が含まれる可能性があるため、より多くの調整が必要です。
perl -ane 'if (/host/ .. /}/) {
print $F[-1] =~ s/[";]//gr unless /[{}]/;
print /}/ ? "\n" : " "
}'
意味は
host
と を含む行の間にある場合は}
入力を処理し、それ以外の場合はスキップします。- 現在の行に中括弧がない場合は、最後の単語を印刷してセミコロンと二重引用符を削除します。
- 行に閉じ括弧が含まれている場合は改行文字が印刷され、そうでない場合はスペースが印刷されます。
答え3
だから、人々が多様で創造的な解決策に答えるのを見てください。私は正規表現愛好家として、要求に応じて正規表現に答えようとしています。
ホストのテストステートメントにセミコロンがないため、あなたの例は正しい形式のドキュメントではないことがわかりました。
ステートメントホストテストで完全に有効な2つの式(固定アドレスとオプション)を無効にする構文エラーがあることがわかります。
正しい形式の文書を使用したいが、この例が間違っている場合は、次のものを使用できます。
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/
私が間違ったことがあれば教えてください。頑張ってください。