数据样例
下面这段文本是 IPCONFIG /ALL
命令的输出结果:
Windows IP 配置
主机名 . . . . . . . . . . . . . : Win10-2020QJFDK
主 DNS 后缀 . . . . . . . . . . . :
节点类型 . . . . . . . . . . . . : 混合
IP 路由已启用 . . . . . . . . . . : 否
WINS 代理已启用 . . . . . . . . . : 否
以太网适配器 本地连接* 9:
媒体状态 . . . . . . . . . . . . : 媒体已断开连接
连接特定的 DNS 后缀 . . . . . . . :
描述. . . . . . . . . . . . . . . : Sangfor SSL VPN CS Support System VNIC
物理地址. . . . . . . . . . . . . : 00-FF-05-0D-13-A2
DHCP 已启用 . . . . . . . . . . . : 否
自动配置已启用. . . . . . . . . . : 是
无线局域网适配器 WLAN:
媒体状态 . . . . . . . . . . . . : 媒体已断开连接
连接特定的 DNS 后缀 . . . . . . . :
描述. . . . . . . . . . . . . . . : Realtek RTL8192EU Wireless LAN 802.11n USB 2.0 Network Adapter
物理地址. . . . . . . . . . . . . : 30-B4-9E-40-FF-0C
DHCP 已启用 . . . . . . . . . . . : 是
自动配置已启用. . . . . . . . . . : 是
无线局域网适配器 本地连接* 10:
媒体状态 . . . . . . . . . . . . : 媒体已断开连接
连接特定的 DNS 后缀 . . . . . . . :
描述. . . . . . . . . . . . . . . : Microsoft Wi-Fi Direct Virtual Adapter
物理地址. . . . . . . . . . . . . : 32-B4-9E-40-FF-0C
DHCP 已启用 . . . . . . . . . . . : 是
自动配置已启用. . . . . . . . . . : 是
以太网适配器 以太网:
连接特定的 DNS 后缀 . . . . . . . :
描述. . . . . . . . . . . . . . . : Realtek PCIe GBE Family Controller
物理地址. . . . . . . . . . . . . : 54-E1-AD-48-66-22
DHCP 已启用 . . . . . . . . . . . : 否
自动配置已启用. . . . . . . . . . : 是
本地链接 IPv6 地址. . . . . . . . : fe80::4195:49da:a7ec:9e68%6(首选)
IPv4 地址 . . . . . . . . . . . . : 192.168.0.68(首选)
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : 192.168.0.1
DHCPv6 IAID . . . . . . . . . . . : 324329901
DHCPv6 客户端 DUID . . . . . . . : 00-01-00-01-26-4E-B2-11-54-E1-AD-48-66-22
DNS 服务器 . . . . . . . . . . . : 61.128.128.68
TCPIP 上的 NetBIOS . . . . . . . : 已启用
分别提取含有"适配器"文字下面的「描述」、「物理地址」、「IP地址」、「子网掩码」、「默认网关」、「DNS 服务器」等信息。某些适配器下面可能实际没有「IP地址」、「子网掩码」、「默认网关」、「DNS 服务器」等,有就提取,没有就略过。
Grammar
unit grammar IPConfig::Grammar;
token TOP { <section>+ %% \n* }
token section {
<header>
\n
<config>+
}
token header { ^^ \N+ \n }
token config { ^^ \s+ \N+ $$ \n* }
Action
unit class IPConfig::Action;
method TOP($/) {
make $/<section>».made;
}
method section($/) {
my $configs = $/<config>».made;
if $configs.elems > 0 {
make ~$/<header> ~ $configs.join('');
} else {
make Empty;
}
}
method header($/) {
make ~$/;
}
method config($/ is copy) {
my $text = ~$/;
if $text.contains(/'描述' | '物理地址' | IPv[4|6] ' ' 地址 | '子网掩码' | DNS ' ' 服务器/) {
$/.make(~$/);
} else {
make Empty;
}
}
提取脚本
use lib '.';
use IPConfig::Grammar;
use IPConfig::Action;
my $ipconfig = IPConfig::Grammar.parsefile(
"data/ifconfig.txt",
:actions(IPConfig::Action)
).made;
.Str.say for @$ipconfig;
输出
以太网适配器 本地连接* 9:
描述. . . . . . . . . . . . . . . : Sangfor SSL VPN CS Support System VNIC
物理地址. . . . . . . . . . . . . : 00-FF-05-0D-13-A2
无线局域网适配器 WLAN:
描述. . . . . . . . . . . . . . . : Realtek RTL8192EU Wireless LAN 802.11n USB 2.0 Network Adapter
物理地址. . . . . . . . . . . . . : 30-B4-9E-40-FF-0C
无线局域网适配器 本地连接* 10:
描述. . . . . . . . . . . . . . . : Microsoft Wi-Fi Direct Virtual Adapter
物理地址. . . . . . . . . . . . . : 32-B4-9E-40-FF-0C
以太网适配器 以太网:
描述. . . . . . . . . . . . . . . : Realtek PCIe GBE Family Controller
物理地址. . . . . . . . . . . . . : 54-E1-AD-48-66-22
本地链接 IPv6 地址. . . . . . . . : fe80::4195:49da:a7ec:9e68%6(首选)
IPv4 地址 . . . . . . . . . . . . : 192.168.0.68(首选)
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : 192.168.0.1
DNS 服务器 . . . . . . . . . . . : 61.128.128.68