在linux中读取属性文件

时间:2014-02-27 19:43:17

标签: linux bash sh

我希望能够在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的所有设置。

3 个答案:

答案 0 :(得分: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 = the new value'

- >使用c命令sed更改整行

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

ps:我喜欢这些'避免抨击'的讨论:)

答案 1 :(得分: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's INI file module或类似的代码。

答案 2 :(得分:0)

首先,我想指出通过脚本修改属性文件可能非常危险,因此在测试时请小心。我可以想到两个可以让你得到你想要的选择。

  1. 如果您只想要一个不会更改的默认文件,只想更换默认文件,那么您可以保留文件的默认版本,并在属性文件和您的默认版本。如果文件不同,请将默认值复制到实际文件中。

  2. 由于我怀疑选项1对您不可行,我会考虑在文件中进行sed替换。有很多关于如何在互联网上编辑sed文件的教程。

  3. 希望这有帮助。