数据样例

下面这段文本是 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