如何用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
说明
- 精准控制处理区间:仅在
nameservers:到search:的范围内操作,不会影响其他配置段 - 排除
addresses:行:确保只修改其下的DNS地址条目 - 兼容任意空格:用
[[:space:]]*匹配任意数量的空格/制表符,无需手动指定空格数 - 精准替换:只针对指定的旧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
说明
- 用标记变量
in_ns控制处理范围:进入nameservers段时标记为1,遇到search:时取消标记,确保只处理目标区间 - 排除
addresses:行,避免误操作该行 - 自动适配格式:
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
相关产品推荐
相关产品推荐

