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

如何用sed或awk修改netplan YAML中的DNS服务器地址

用sed/awk修改Netplan配置中的DNS地址

原配置

network:
  ethernets:
    ens160:
      addresses:
      - 10.200.2.11/22
      gateway4: 10.200.0.1
      nameservers:
        addresses:
        - 8.8.8.8
        - 4.4.4.4
        search:
        - cybertax.live
  version: 2

需求

仅通过sed或awk工具,将nameservers下的DNS地址8.8.8.8和4.4.4.4替换为10.10.10.10和10.10.10.11,无法使用或安装yq工具。

现有脚本的问题

  • 匹配范围错误:包含了addresses和search行,仅需处理两者之间的DNS地址条目
  • 误处理注释行:会在已注释的addresses行后添加DNS地址,不符合需求
  • 格式兼容性差:需要手动指定空格数量,无法用.*匹配任意空格,且破坏原有数组格式

解决方案

用sed实现

sed -E '/^[[:space:]]*nameservers:/,/^[[:space:]]*search:/ {
  /^[[:space:]]*addresses:/!{
    /^[[:space:]]*-[[:space:]]*8\.8\.8\.8/s/8\.8\.8\.8/10.10.10.10/
    /^[[:space:]]*-[[:space:]]*4\.4\.4\.4/s/4\.4\.4\.4/10.10.10.11/
  }
}' your-netplan-config.yaml

说明

  1. 精准控制处理区间:仅在nameservers:到search:的范围内操作,不会影响其他配置段
  2. 排除addresses:行:确保只修改其下的DNS地址条目
  3. 兼容任意空格:用[[:space:]]*匹配任意数量的空格/制表符,无需手动指定空格数
  4. 精准替换:只针对指定的旧DNS地址进行替换,不会误改其他内容

用awk实现

awk '
/^[[:space:]]*nameservers:/ { in_ns=1 }
in_ns && /^[[:space:]]*search:/ { in_ns=0 }
in_ns && !/^[[:space:]]*addresses:/ {
  sub(/8\.8\.8\.8/, "10.10.10.10")
  sub(/4\.4\.4\.4/, "10.10.10.11")
}
1' your-netplan-config.yaml

说明

  1. 用标记变量in_ns控制处理范围:进入nameservers段时标记为1,遇到search:时取消标记,确保只处理目标区间
  2. 排除addresses:行,避免误操作该行
  3. 自动适配格式:sub()仅替换目标DNS地址,保留原有配置的空格和数组结构

验证与生效

先备份原配置文件,再将修改后的内容覆盖原文件(避免直接修改导致配置丢失):

# sed版本备份并修改
cp your-netplan-config.yaml your-netplan-config.yaml.bak
sed -E '/^[[:space:]]*nameservers:/,/^[[:space:]]*search:/ {
  /^[[:space:]]*addresses:/!{
    /^[[:space:]]*-[[:space:]]*8\.8\.8\.8/s/8\.8\.8\.8/10.10.10.10/
    /^[[:space:]]*-[[:space:]]*4\.4\.4\.4/s/4\.4\.4\.4/10.10.10.11/
  }
}' your-netplan-config.yaml.bak > your-netplan-config.yaml

# awk版本备份并修改
cp your-netplan-config.yaml your-netplan-config.yaml.bak
awk '
/^[[:space:]]*nameservers:/ { in_ns=1 }
in_ns && /^[[:space:]]*search:/ { in_ns=0 }
in_ns && !/^[[:space:]]*addresses:/ {
  sub(/8\.8\.8\.8/, "10.10.10.10")
  sub(/4\.4\.4\.4/, "10.10.10.11")
}
1' your-netplan-config.yaml.bak > your-netplan-config.yaml

修改完成后,执行netplan apply使配置生效。

内容的提问来源于stack exchange,提问作者Dave

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:15:34