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
세 매개변수 중 하나가 누락된 경우 공백으로 두십시오.
표현식을 한 줄씩 적용해야 하더라도 이는 여전히 허용됩니다. 물론 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 줄은 당신이 원하는 거의 출력을 하는 것 같습니다:
perl -ane 'print $F[-1] =~ s/[";]//gr unless /[{}]/; print /^$/ ? "\n" : " "'
하지만 입력에 완전히 건너뛰고 싶은 부분이 포함될 수 있으므로 더 많은 조정이 필요합니다.
perl -ane 'if (/host/ .. /}/) {
print $F[-1] =~ s/[";]//gr unless /[{}]/;
print /}/ ? "\n" : " "
}'
의미는
host
과 가 포함된 줄 사이에 있으면}
입력을 처리하고, 그렇지 않으면 건너뜁니다.- 현재 줄에 중괄호가 없으면 마지막 단어를 인쇄하고 세미콜론과 큰따옴표를 제거합니다.
- 줄에 닫는 중괄호가 포함되어 있으면 개행 문자가 인쇄되고, 그렇지 않으면 공백이 인쇄됩니다.
답변3
그래서 사람들이 다양하고 창의적인 솔루션으로 답하는 것을 봅니다. 저는 정규식 매니아로서 요청에 따라 정규식으로 답변하려고 노력합니다.
호스트 Test 문에 세미콜론이 없기 때문에 귀하의 예제는 올바른 형식의 문서가 아닌 것으로 나타났습니다.
명령문 호스트 Test에서 완벽하게 유효한 두 표현식(고정 주소 및 옵션)을 무효화하는 구문 오류가 있음을 알 수 있습니다.
올바른 형식의 문서를 사용하고 싶지만 이 예가 잘못된 경우 다음을 사용할 수 있습니다.
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/
제가 실수한 것이 있다면 말씀해주세요. 행운을 빌어요.