使用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
说明
正则
(?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文件
转换为PSCustomObject后,可以直接用
Export-Csv生成标准CSV,无需手动拼接格式,可靠性更高。解决了原方法中换行符处理的问题,因为正则直接捕获完整块,不需要处理零散的换行。
内容的提问来源于stack exchange,提问作者NerdyK
相关产品推荐
相关产品推荐

