如何使用PowerShell提取指定格式的DNS记录内容?
用PowerShell提取DNS记录的指定内容
我来帮你搞定这个需求!要从IN NS google-public-dns-a.google.com. ; in the domain这种格式的DNS记录里提取出NS google-public-dns-a.google.com.,有两种简单好用的PowerShell方法,我给你详细拆解:
方法一:正则表达式替换(最简洁高效)
正则可以精准匹配并提取我们需要的部分,同时自动忽略开头的IN和末尾的注释。直接用-replace操作符就能搞定:
# 单条记录测试 $dnsLine = "IN NS google-public-dns-a.google.com. ; in the domain" $dnsLine -replace '^\s*IN\s+(\w+)\s+(\S+)\s*;.*$', '$1 $2'
正则说明:
^\s*IN\s+:匹配开头的空白(如果有的话)+IN+ 任意数量空格(\w+):捕获记录类型(NS/SOA/A/MX这些单词)\s+(\S+):匹配空格后,捕获主机名(连续非空白字符,比如google-public-dns-a.google.com.)\s*;.*$:匹配注释部分(分号及后面所有内容)- 替换成
$1 $2就是把捕获的记录类型和主机名拼接起来
如果是批量处理文件里的DNS记录,直接管道传递即可:
Get-Content "你的DNS记录文件.txt" | ForEach-Object { $_ -replace '^\s*IN\s+(\w+)\s+(\S+)\s*;.*$', '$1 $2' }
方法二:字符串拆分筛选(更直观,适合新手理解)
如果觉得正则有点抽象,也可以用拆分字符串的方式分步处理:
$dnsLine = "IN NS google-public-dns-a.google.com. ; in the domain" # 第一步:拆分注释,只保留分号前的内容 $cleanContent = $dnsLine -split ';', 2 | Select-Object -First 1 # 第二步:按空白字符拆分,过滤掉空字符串 $parts = $cleanContent -split '\s+' | Where-Object { $_ } # 第三步:判断记录类型是否在目标列表里,然后拼接结果 if ($parts[1] -in ('NS','SOA','A','MX')) { "$($parts[1]) $($parts[2])" }
为什么你的现有代码不行?
你原来的代码只捕获了记录类型,没处理后面的主机名,也没去掉开头的IN和末尾的注释,所以没法得到完整的目标结果。上面两种方法都解决了这些问题~
内容的提问来源于stack exchange,提问作者PowershellLearner




