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

세 매개변수 중 하나가 누락된 경우 공백으로 두십시오.

표현식을 한 줄씩 적용해야 하는 경우에도 여전히 허용됩니다. 물론 구성 파일을 한 줄씩 읽는 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 문에 세미콜론이 없기 때문에 샘플이 제대로 구성된 문서가 아닌 것으로 나타났습니다.

보시다시피 거기에 구문 오류가 있으며 이는 명령문 호스트 테스트 내에서 완벽하게 합리적인 두 가지 표현식인 고정 주소와 옵션을 무효화합니다.

올바른 형식의 문서로 작업하고 싶은데 이 예제에 오류가 있는 경우 다음을 사용할 수 있습니다.

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/

내가 실수를 했다면 알려주세요. 행운을 빌어요.

관련 정보