You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何更简洁地从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 17:00:04