如何用awk从dig解析结果中提取子域名www并正确替换字段?
问题
我从dig命令的返回结果中提取到如下“应答部分”:
www.google.com 300 IN A <ip_address>
我需要从www.google.com里提取子域名www并存到变量中,同时必须使用awk处理。我尝试先用sed过滤出子域名,再在awk里替换字段,代码如下:
host_name=$(echo get_dig "$@" | sed 's/..*//; s/ .*//') ... get_dig "$@" | awk '{ $1 = $host_name; printf("The subdomain %s is a %s record and points to %s\n", $1, $4, $5) }'
注:get_dig是我编写的shell函数,用于执行dig并提取“应答部分”。
测试后sed能正确得到www,但在awk里替换$1后,printf输出的主机名变成了整个dig应答内容,且我已全局声明$host_name。现在感觉陷入了依赖sed的固定思路,求可行的解决办法。
解决办法
方法一:用awk一步完成提取与输出(无需sed)
awk本身具备字符串分割能力,完全可以直接处理域名提取,不用额外调用sed。通过split()函数将第一个字段按.拆分,取第一个元素就是目标子域名:
get_dig "$@" | awk '{ split($1, domain_parts, "."); subdomain = domain_parts[1]; printf("The subdomain %s is a %s record and points to %s\n", subdomain, $4, $5) }'
这种方式无需提前存储变量,直接在awk内完成所有逻辑,避免了shell与awk之间的变量传递问题。
方法二:若需传递shell变量到awk
你的核心问题是awk无法直接读取shell的host_name变量——awk有独立的变量空间,直接写$host_name会被awk解析为“取第host_name个字段”,而host_name是字符串www,会被当作0处理,$0就是整行内容,所以输出了整个应答。
要将shell变量传给awk,需使用-v参数显式传递:
# 先用awk替代sed提取子域名(也可以保留你的sed写法) host_name=$(get_dig "$@" | awk '{split($1, p, "."); print p[1]}') # 通过-v参数将shell变量host_name赋值给awk的hn变量 get_dig "$@" | awk -v hn="$host_name" '{ $1 = hn; printf("The subdomain %s is a %s record and points to %s\n", $1, $4, $5) }'
内容的提问来源于stack exchange,提问作者Koyejo
相关产品推荐
相关产品推荐

