Tendo dificuldade em obter o regex Powershell multi-line para funcionar - sem resultados

2

Eu me referi a vários exemplos que consegui pesquisar, o que pareceu muito pertinente, mas ainda não consigo fazer isso funcionar.

Minha entrada é assim, a partir de um comando de estatísticas do servidor dhcp, e eu confirmei que a saída $ está sendo definida corretamente com linhas semelhantes a:

MIBCounts:
        Discovers = 63911.
        Offers = 3903.
        Delayed Offers = 0.
        Requests = 29199.
        Acks = 273080.
        Naks = 71.
        Declines = 0.
        Releases = 395.
        ServerStartTime = Tuesday, March 27, 2012 7:38:53 PM
        Scopes = 34.
        Scopes with Delay configured= 0.
        Subnet = 10.31.0.0.
                No. of Addresses in use = 203.
                No. of free Addresses = 40774.
                No. of pending offers = 0.
        Subnet = 10.32.3.0.
                No. of Addresses in use = 0.
                No. of free Addresses = 0.
                No. of pending offers = 0.
        Subnet = 10.32.100.0.
                No. of Addresses in use = 48.
                No. of free Addresses = 145.
                No. of pending offers = 0.
        Subnet = 10.32.101.0.
                No. of Addresses in use = 34.
                No. of free Addresses = 159.
                No. of pending offers = 0.

Então, o que tentei foi isso, mas não encontrei correspondências:

$output=$(netsh -r myserver dhcp server show mibinfo)

$dhcp_regex=@"
(?s)Subnet = (\d\.\d\.\d\.\d)\.\W+
.*No\. of Addresses in use = (\d+)\.\W+
.*No\. of free Addresses = (\d+)\.\W+
"@

$dhcp_record= {
    @{
        subnet=$matches[0]
        inuse=$matches[1]
        free=$matches[2]
    }}


$output -match $dhcp_regex

$matches

Assistência apreciada.

    
por Kevin 19.04.2012 / 22:01

2 respostas

3

Tente isso na sua primeira linha:

(?s)Subnet = (\d+\.\d+\.\d+\.\d+)\.\W*

Você também desejará ver cada linha separadamente:

$output | % { $_ -match $dhcp_regex }

# Anexar | Out-Null se você não quiser que cada linha seja impressa na sua tela.

$ matches [1]

Editar: aqui está um exemplo mais completo.

$dhcp_regex = 'Subnet = (\d+\.\d+\.\d+\.\d+)'
$dhcp_regex2 = 'in use = (\d+)'
$output | ? { $_ -match $dhcp_regex -or $_ -match $dhcp_regex2} | % { $Matches[1] }

Editar: aqui está um exemplo de várias linhas.

$dhcp_regex = '(?m)Subnet = (\d+\.\d+\.\d+\.\d+)\.\r\n.*in use = (\d+)'
$output | Out-String | % { $_ -match $dhcp_regex }
$matches

dica do chapéu: link

Editar: parece que (?m) não é realmente necessário. Out-String é o molho secreto.

    
por 19.04.2012 / 22:15
1

Alterou a regex que você forneceu para adicionar o elemento de dados extra.

$dhcp_regex='(?m)Subnet = (\d+\.\d+\.\d+\.\d+)\.\r\n.*in use = (\d+)\.\r\n.* free Addresses = (\d+)\.'

Isso funciona bem agora - muito apreciado! Eu posso passar algum tempo quando estou entediado (hehe) para descobrir de que maneira sutil o que estávamos fazendo antes estava falhando.

    
por 23.04.2012 / 22:54