我有一个程序,它会针对新服务器安装运行一组命令,我需要为每个安装更改文件中的条目。我们需要将默认 DNS 从 127.0.0.X(由于安装时没有互联网连接,因此默认为 127.0.0.X)更改为 8.8.8.8
我使用了以下命令:
sudo awk '{sub(/#DNS=/,"DNS=8.8.8.8")}' /etc/systemd/resolved.conf
然而这似乎在 gawk/new OS 版本下不起作用。
sudo gawk '{gensub(/#DNS=/,"DNS=8.8.8.8")}' /etc/systemd/resolved.conf
我做错了什么?有没有更好的方法来更改默认 DNS 条目?
当前服务器操作系统:Ubuntu 24.04.2-live-server
以前的服务器操作系统:Ubuntu 20.04.6-live-server
编辑:
样例行输入文件:
#DNS=
#FallbackDNS=
#Domains
该命令应该找到上面的第一行并将其替换为,DNS=8.8.8.8
但是事实并非如此。
期望输出:
DNS=8.8.8.8
#FallbackDNS=
#Domains
当我运行 awk 命令时,文件仍然显示:
#DNS=
#FallbackDNS=
#Domains
此外,它应该只查找和替换完全匹配的#DNS=
#DNS=
用什么命令和语法来替换DNS=8.8.8.8
?
OP 的第二个
awk
脚本应该生成类似于以下内容的语法错误:这是由于缺少第 3 个参数
gensub()
。除了语法错误之外,OP 的两个
awk
脚本实际上都没有包含将内容打印到标准输出的命令。修改 OP 的第一个
awk
脚本以将所有(已修改的)行打印到标准输出:通过此修改,我们看到:
请注意,这些行显示于控制台上,留给我们下一个问题...如何将这些更改应用到
resolved.conf
。OP 有几个选择:
使用
gawk's
-i inplace
指令:将标准输出定向到临时文件,然后
resolved.conf
用临时文件的内容覆盖另一个
awk
脚本用来替换以 开头的行#DNS=
,并使用-i inplace
指令:我理解这句话“此外,它应该只查找和替换完全匹配的
#DNS=
”为“替换与字符串完全匹配的行,而其前后没有任何字符”。这意味着您不需要替换子字符串/模式,您可以替换整行。
解释:
/^#DNS=$/
如果从头到尾的行匹配,#DNS=
$0 = "DNS=8.8.8.8"
则用字符串1
快捷方式替换整行{ print }
(=true
带有默认操作的条件print
)请注意,上述命令不会更新输入文件。
你可以使用这样的方法: