如何更简洁地从FQDN中提取末尾两段域名?
提取FQDN末尾最后两段的简洁方法
问题背景
当前从FQDN提取末尾两段的实现方式如下:
fqdn=$(hostname -f) domain=$(echo "$fqdn" | rev | cut -f2,1 -d'.' | rev)
实际执行效果:
fqdn: "server.dc1.something.hello.com" domain: "hello.com" fqdn: "11.22.33" domain: "22.33" fqdn: "11.22.33.44" domain: "33.44"
但这种方法逻辑绕、可读性差,还用到了echo命令,需要更简洁的替代方案。
方法1:Bash内置参数展开(无外部命令)
直接用bash的字符串处理特性,不用调用外部工具,效率最高:
fqdn=$(hostname -f) # 分步写法,更易读 last_segment=${fqdn##*.} prefix=${fqdn%.*.*} domain="${prefix##*.}.$last_segment" # 或者紧凑一行写法 domain="${fqdn%.*.*}.${fqdn##*.}"
原理:
${fqdn##*.}:删掉最后一个.左边的所有内容,拿到最后一段${fqdn%.*.*}:删掉最后两个.及其右边的内容,再取剩下部分的最后一段,就是倒数第二段- 把两段拼接起来就是目标结果
方法2:Awk直接提取倒数字段
用awk按.分割后,直接取倒数第二和最后一个字段:
fqdn=$(hostname -f) # 避免echo的写法(用here-string) domain=$(awk -F. '{print $(NF-1)"."$NF}' <<< "$fqdn")
原理:
-F.:设置分隔符为.NF是当前行的总字段数,$(NF-1)对应倒数第二个字段,$NF对应最后一个字段,直接拼接输出
方法3:Sed正则匹配捕获
用正则表达式精准捕获末尾的两段内容:
fqdn=$(hostname -f) # 避免echo的写法 domain=$(sed -E 's/.*\.([^.]+\.[^.]+)$/\1/' <<< "$fqdn")
原理:
- 正则
.*\.匹配最后两个.之前的所有字符 ([^.]+\.[^.]+)$捕获末尾的两段(每段都不含.)- 替换时只保留捕获的部分,得到目标域名
内容的提问来源于stack exchange,提问作者zappee
相关产品推荐
相关产品推荐

