我希望能够在 Linux 中读取属性文件,请检查是否存在某些属性。如果我正在寻找的属性存在,但它们与我正在寻找的值不匹配,我想覆盖这些各自的属性。如果它们不存在,那么我想将它们写入文件。
任何Linux大师都可以帮助我解决这个问题吗?
提前感谢!
键名称也可以采用 pre1.pre2.pre3 的形式所以像pre1.pre2.pre3 = 值
以下是属性文件
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.all.disable_ipv6 = 1
kernel.sysrq = 0
net.ipv4.ip_forward = 0
net.ipv4.tcp_syncookies = 1
net.ipv6.conf.all.forwarding = 0
net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_keepalive_intvl = 5
net.ipv4.tcp_keepalive_probes = 5
我想基本上更改 tcp 的所有设置。
下面是一些可能对脚本有用的步骤:
- 属性中是否存在 foo.bar?
if grep foo.bar a.properties ; then echo found ; else echo not found; fi
-> if
测试grep
的结果
- 将属性替换为其新值
cat a.properties | sed '/foo.bar/cfoo.bar = the new value'
-> sed
使用 c 命令更改整行
看起来最后一个命令就是您所需要的:)
ps:我喜欢这些"避免抨击"的讨论:)
#!/bin/sh
ensure_value() {
file="$1"
property="$2"
value="$3"
if ! grep -q "$property" "$file"; then
echo $property = $value >> "$file"
else
sed -i -e "s/^$property.*/$property = $value/g" "$file"
fi
}
# cp props props.$(date +%s).bak
ensure_value props net.ipv6.conf.all.disable_ipv6 1
ensure_value props net.ipv4.ip_forward 1
# etc.
此脚本不安全或生产就绪!请注意,该函数ensure_value
评估属性名称中的正则表达式,如果您的属性最终类似于 .*
.真的,你应该使用Ansible的INI文件模块或类似的模块。
首先,我想指出,通过脚本修改属性文件可能非常危险,因此在测试时请小心。 我可以想到两个选项可以让你得到你想要的。
-
如果您只想要一个不会更改的默认文件,并且只想用默认文件替换您拥有的文件,那么您可以保留该文件的默认版本,并在属性文件和默认版本之间进行简单的比较。 如果文件不同,请将默认值复制到实际文件。
-
由于我怀疑选项 1 对您不可行,因此我会考虑在文件中进行 sed 替换。 互联网上有很多关于如何使用 sed 编辑文件的教程。
希望这有帮助。