在Linux中读取属性文件

3
我希望能在linux中读取属性文件,并检查某些属性是否存在。如果我要查找的属性存在,但它们与我要查找的值不匹配,我想覆盖这些相应的属性。如果它们不存在,则我想将它们写入文件。
有没有Linux专家能帮我解决这个问题?
提前致谢!
此外,键名可以采用pre1.pre2.pre3的形式,例如: pre1.pre2.pre3 = value 以下是属性文件:
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的所有设置。


什么是属性文件,它长什么样子? - SzG
我的问题中包含了属性文件。基本上,我想通过脚本覆盖/etc/sysctl.conf中的属性,以便它们在系统重启时得以保留。 - Abdul Rahman
文件编辑怎么办?sudo nano /etc/sysctl.conf - SzG
无法这样做。需要一个脚本来自动化这个过程。 - Abdul Rahman
我有点好奇。您想要一个脚本来设置这些系统变量(通常在启动时通过sysctl或sysctl.conf设置,如上所述)。如果我没记错的话,您需要root权限才能设置这些变量。那么为什么需要通过脚本设置这些变量呢?如果您需要这样的非标准解决方案,肯定有原因。 - tvm
显示剩余4条评论
3个回答

3
以下是与您的脚本相关的一些步骤:
  • 在a.properties中是否存在foo.bar?

if grep foo.bar a.properties ; then echo found ; else echo not found; fi

->if测试grep的结果

  • 使用其新值替换属性

cat a.properties | sed '/foo.bar/c\foo.bar = 新值'

-> sed 的c命令可以更改整行

看起来最后一个命令就是你需要的了:)

注:我喜欢这些“避免bash”的讨论 :)


我刚刚运行了这个命令:cat a.properties | sed '/foo.bar/c\foo.bar = the new value' > a.properties,但它只是清空了文件。在此之前,a.properties 文件中有一个 foo.bar = 12 的值。 - Abdul Rahman
不要在仍在操作命令时重定向,这太危险了。 - Jan Groth
好的,我不明白你所说的“above”是什么意思。这是我第一次使用Bash,我做错了什么吗? - Abdul Rahman

1
#!/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文件模块或类似工具代替。

0

首先,我想指出通过脚本修改属性文件可能会非常危险,因此在测试时要小心。 我能想到两个选项可以满足您的需求。

  1. 如果您只需要一个默认文件,并且不会更改它,只需将其替换为默认文件即可。 您可以手动准备一个默认版本的文件,并对比属性文件与默认版本的差异。 如果文件不同,请将默认版本复制到实际文件。

  2. 由于我怀疑选项1对您不可行,所以尝试在文件中进行 sed 替换。 有许多关于如何使用 sed 编辑文件的教程在互联网上。

希望这可以帮助您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接