gpt4 book ai didi

regex - 用 perl 解析 scutil 输出

转载 作者:行者123 更新时间:2023-12-04 12:06:36 25 4
gpt4 key购买 nike

我想从 Mac OSX 的 scutil 中检索信息带有 perl 脚本的命令。

该工具生成的输出有点类似于 JSON,但到目前为止,我找不到任何能够解析它的东西。

例子:

scutil
> open
> show State:/Network/Service/0F70B221-EEF7-4ACC-96D8-ECBA3A15F132/IPv4
<dictionary> {
ARPResolvedHardwareAddress : 00:1b:c0:4a:82:f9
ARPResolvedIPAddress : 10.10.0.254
AdditionalRoutes : <array> {
0 : <dictionary> {
DestinationAddress : 10.10.0.146
SubnetMask : 255.255.255.255
}
1 : <dictionary> {
DestinationAddress : 169.254.0.0
SubnetMask : 255.255.0.0
}
}
Addresses : <array> {
0 : 10.10.0.146
}
ConfirmedInterfaceName : en0
InterfaceName : en0
NetworkSignature : IPv4.Router=10.10.0.254;IPv4.RouterHardwareAddress=00:1b:c0:4a:82:f9
Router : 10.10.0.254
SubnetMasks : <array> {
0 : 255.255.255.0
}
}

我已经设法通过正则表达式检索特定元素,但由于我需要进行几种不同的查找,我正在寻找一种更智能、更通用的方法。

现在,在我通过编写另一个 perl 解析器来重新发明轮子之前,我希望有人能识别这种格式并可以给出一些建议如何在嵌套的 perl 哈希映射中解析它。

欢迎任何意见。

最佳答案

在 Perl 中,您可以使用 Marpa::R2 , 到 Marpa, a general BNF parser 的 Perl 接口(interface).

这是一个简单的例子:

use 5.010;
use strict;
use warnings;

use Data::Dumper;
$Data::Dumper::Indent = 1;
$Data::Dumper::Terse = 1;
$Data::Dumper::Deepcopy = 1;

use Marpa::R2;

my $g = Marpa::R2::Scanless::G->new( { source => \(<<'END_OF_SOURCE'),
:default ::= action => [ name, value]
lexeme default = action => [ name, value] latm => 1

scutil ::= 'scutil' '> open' '> show' path '<dictionary>' '{' pairs '}'
path ~ [\w/:\-]+

pairs ::= pair+
pair ::= name ':' value
name ~ [\w]+
value ::= ip | mac | interface | signature | array | dict

ip ~ octet '.' octet '.' octet '.' octet
octet ~ [\d]+
mac ~ [a-z0-9][a-z0-9]':'[a-z0-9][a-z0-9]':'[a-z0-9][a-z0-9]':'[a-z0-9][a-z0-9]':'[a-z0-9][a-z0-9]':'[a-z0-9][a-z0-9]
interface ~ [\w]+

signature ::= signature_item+ separator => [;]
signature_item ::= signature_item_name '=' signature_item_value
signature_item_name ~ [\w\.]+
signature_item_value ::= ip | mac

dict ::= '<dictionary>' '{' pairs '}'
array ::= '<array>' '{' items '}'
items ::= item+
item ::= index ':' value
index ~ [\d]+

:discard ~ whitespace
whitespace ~ [\s]+
END_OF_SOURCE
} );

my $input = <<EOI;
scutil
> open
> show State:/Network/Service/0F70B221-EEF7-4ACC-96D8-ECBA3A15F132/IPv4
<dictionary> {
ARPResolvedHardwareAddress : 00:1b:c0:4a:82:f9
ARPResolvedIPAddress : 10.10.0.254
AdditionalRoutes : <array> {
0 : <dictionary> {
DestinationAddress : 10.10.0.146
SubnetMask : 255.255.255.255
}
1 : <dictionary> {
DestinationAddress : 169.254.0.0
SubnetMask : 255.255.0.0
}
}
Addresses : <array> {
0 : 10.10.0.146
}
ConfirmedInterfaceName : en0
InterfaceName : en0
NetworkSignature : IPv4.Router=10.10.0.254;IPv4.RouterHardwareAddress=00:1b:c0:4a:82:f9
Router : 10.10.0.254
SubnetMasks : <array> {
0 : 255.255.255.0
}
}
EOI

say Dumper $g->parse( \$input, { trace_terminals => 0 } );

输出:

\[
'scutil',
'scutil',
'> open',
'> show',
[
'path',
'State:/Network/Service/0F70B221-EEF7-4ACC-96D8-ECBA3A15F132/IPv4'
],
'<dictionary>',
'{',
[
'pairs',
[
'pair',
[
'name',
'ARPResolvedHardwareAddress'
],
':',
[
'value',
[
'mac',
'00:1b:c0:4a:82:f9'
]
]
],
[
'pair',
[
'name',
'ARPResolvedIPAddress'
],
':',
[
'value',
[
'ip',
'10.10.0.254'
]
]
],
[
'pair',
[
'name',
'AdditionalRoutes'
],
':',
[
'value',
[
'array',
'<array>',
'{',
[
'items',
[
'item',
[
'index',
'0'
],
':',
[
'value',
[
'dict',
'<dictionary>',
'{',
[
'pairs',
[
'pair',
[
'name',
'DestinationAddress'
],
':',
[
'value',
[
'ip',
'10.10.0.146'
]
]
],
[
'pair',
[
'name',
'SubnetMask'
],
':',
[
'value',
[
'ip',
'255.255.255.255'
]
]
]
],
'}'
]
]
],
[
'item',
[
'index',
'1'
],
':',
[
'value',
[
'dict',
'<dictionary>',
'{',
[
'pairs',
[
'pair',
[
'name',
'DestinationAddress'
],
':',
[
'value',
[
'ip',
'169.254.0.0'
]
]
],
[
'pair',
[
'name',
'SubnetMask'
],
':',
[
'value',
[
'ip',
'255.255.0.0'
]
]
]
],
'}'
]
]
]
],
'}'
]
]
],
[
'pair',
[
'name',
'Addresses'
],
':',
[
'value',
[
'array',
'<array>',
'{',
[
'items',
[
'item',
[
'index',
'0'
],
':',
[
'value',
[
'ip',
'10.10.0.146'
]
]
]
],
'}'
]
]
],
[
'pair',
[
'name',
'ConfirmedInterfaceName'
],
':',
[
'value',
[
'interface',
'en0'
]
]
],
[
'pair',
[
'name',
'InterfaceName'
],
':',
[
'value',
[
'interface',
'en0'
]
]
],
[
'pair',
[
'name',
'NetworkSignature'
],
':',
[
'value',
[
'signature',
[
'signature_item',
[
'signature_item_name',
'IPv4.Router'
],
'=',
[
'signature_item_value',
[
'ip',
'10.10.0.254'
]
]
],
[
'signature_item',
[
'signature_item_name',
'IPv4.RouterHardwareAddress'
],
'=',
[
'signature_item_value',
[
'mac',
'00:1b:c0:4a:82:f9'
]
]
]
]
]
],
[
'pair',
[
'name',
'Router'
],
':',
[
'value',
[
'ip',
'10.10.0.254'
]
]
],
[
'pair',
[
'name',
'SubnetMasks'
],
':',
[
'value',
[
'array',
'<array>',
'{',
[
'items',
[
'item',
[
'index',
'0'
],
':',
[
'value',
[
'ip',
'255.255.255.0'
]
]
]
],
'}'
]
]
]
],
'}'
]

关于regex - 用 perl 解析 scutil 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31612329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com