如何实现grep -v结合-A/B功能并格式化nslookup输出?
解决nslookup批量查询后的格式精简问题
方法一:用awk直接处理批量输出
直接在原循环命令后追加awk处理,提取关键字段并格式化输出:
for i in {1..12}; do nslookup hostname1.fqdn ns$i.provider.fqdn nslookup hostname2.fqdn ns$i.provider.fqdn done | awk ' /^Server:/ { dns = $2 } /^Name:/ { host = $2 } /^Address: / && !/^Address:.*#/ { printf "DNS: %s HOST: %s IP: %s\n", dns, host, $2 } '
逻辑说明:
- 匹配
Server:开头的行,提取DNS服务器地址存入变量dns - 匹配
Name:开头的行,提取查询的主机名存入变量host - 匹配
Address:开头且不含端口号(即不带#)的行,输出格式化后的结果
方法二:逐查询独立处理(更可靠)
改进循环结构,把每个域名+DNS服务器的查询单独交给awk处理,避免跨查询的字段干扰:
for i in {1..12}; do for target_host in hostname1.fqdn hostname2.fqdn; do nslookup "$target_host" "ns$i.provider.fqdn" | awk -v dns="ns$i.provider.fqdn" -v host="$target_host" ' /^Address: / && !/^Address:.*#/ { printf "DNS: %s HOST: %s IP: %s\n", dns, host, $2 } ' done done
优势:
- 直接将DNS服务器和目标域名作为变量传入awk,无需依赖nslookup输出的
Server/Name字段,避免输出格式变动导致的错误 - 每个查询独立处理,逻辑更清晰
为什么之前的grep方法无效?
grep默认按单行处理,-E中的\n无法匹配实际换行(除非使用-z参数将输入视为null分隔的块),且grep不擅长关联多行字段进行格式化,这类场景下awk/sed是更合适的工具。
内容的提问来源于stack exchange,提问作者AdamG
相关产品推荐
相关产品推荐

