You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PowerShell将DNS Zone配置文件转换为CSV的技术疑问

问题:将BIND DNS Zone配置转换为CSV格式

我用PowerShell连接服务器拉取了多个DNS配置,已经把Zone配置文件的原始内容读到变量里了。现在需要把这些Zone配置转成CSV格式,方便脚本里做查询和对比。

目前单条正则匹配能正常工作,但没法实现多行匹配并把每个Zone对应的配置组关联起来。另外我试过用查找替换生成CSV,但没法移除分号后的换行符,而且如果Zone文件格式混乱,这种方法也失效。

原始配置示例

# 从BIND拉取的输出示例:
$configurationText = @" 
// DNS Zone configuration file

// Root server list
zone "." IN {
        type hint;
        file "root.hints";
};

zone "my.domain.com" IN {
        type primary;
        file "zones/zone.my.domain.com";
};

zone "my.domain.org" IN {
        type primary;
        file "zones/zone.my.domain.org";
};

"@

尝试的多行正则匹配代码

# 多行正则查询
$regex = @" 
(?<=zone ")(?<zone>.*?)(?=")
(?<=type )(?<type>.*?)(?=;)
(?<=file ")(?<file>.*?)(?=")
"@
# 测试匹配结果!
select-string -InputObject $configurationText -pattern $regex -allmatch | ForEach-Object { $_.Matches } | Out-GridView

尝试的查找替换生成CSV代码(存在问题)

$DNSTemp = $configurationText -replace '// DNS Zone configuration file','Zone,Type,File'
$DNSTemp = $DNSTemp -replace '// Root server list',""
$DNSTemp = $DNSTemp -replace '.*zone "',''
$DNSTemp = $DNSTemp -replace '.*type ',''
$DNSTemp = $DNSTemp -replace '.*file "',''
$DNSTemp = $DNSTemp -replace '" IN {',';'
$DNSTemp = $DNSTemp -replace '};',''
$DNSTemp = $DNSTemp -replace '";',';'
# 这个替换不生效
$DNSTemp = $DNSTemp -replace ';`n',','

解决方案

方法:使用多行正则捕获完整Zone块并提取字段

核心思路是先匹配每个完整的Zone配置块,再从每个块里提取zone、type、file字段,最后输出为CSV。

# 匹配完整Zone块的正则,支持多行和任意空格缩进
$zoneRegex = '(?s)zone\s+"(?<zone>[^"]+)"\s+IN\s+\{\s*type\s+(?<type>[^;]+);\s*file\s+"(?<file>[^"]+)"\s*;\s*\}'

# 提取所有匹配的Zone块
$matches = [regex]::Matches($configurationText, $zoneRegex)

# 转换为自定义对象,然后导出为CSV
$zoneObjects = $matches | ForEach-Object {
    [PSCustomObject]@{
        Zone = $_.Groups['zone'].Value
        Type = $_.Groups['type'].Value.Trim()
        File = $_.Groups['file'].Value
    }
}

# 输出到控制台或保存为CSV
$zoneObjects | Format-Table -AutoSize
$zoneObjects | Export-Csv -Path "DnsZones.csv" -NoTypeInformation

说明

  1. 正则(?s)zone\s+"(?<zone>[^"]+)"\s+IN\s+\{\s*type\s+(?<type>[^;]+);\s*file\s+"(?<file>[^"]+)"\s*;\s*\}:

    • (?s):启用单行模式,让.匹配换行符
    • 捕获zone名称:(?<zone>[^"]+),匹配引号内的所有内容
    • 捕获type值:(?<type>[^;]+),匹配分号前的所有内容
    • 捕获file路径:(?<file>[^"]+),匹配引号内的文件路径
    • 忽略块内的任意空格和缩进,兼容格式略有混乱的Zone文件
  2. 转换为PSCustomObject后,可以直接用Export-Csv生成标准CSV,无需手动拼接格式,可靠性更高。

  3. 解决了原方法中换行符处理的问题,因为正则直接捕获完整块,不需要处理零散的换行。

内容的提问来源于stack exchange,提问作者NerdyK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 08:14:51