如何替换文件中的值

时间:2014-04-16 12:52:21

标签: linux bash

我正在编写一个脚本来改变sysctl.conf

中文件/etc directory中的几个值

如果变量值小于该值,则应将该值更改为低于给定值

例如:

sysctl.conf文件包含以下行(括号中的术语是我自己的注释,不在实际文件中):

kernel.shmall = 5194304 (more than 4194304 so it should leave it as it is)
kernel.shmmax = 2147483648 (it is equal to 2147483648 so it should leave it as it is)
kernel.msgmni = 124 (it is less than 1024 so it should alter the value to 1024)

期待输出

kernel.shmall = 5194304 
kernel.shmmax = 2147483648
kernel.msgmni = 1024

这是我的脚本如果值小于或等于kernel.shmall,我准备替换4194303

脚本:

#!/bin/sh
echo `cat /etc/sysctl.conf|fgrep kernel.shmall` | while read kernel.shmall
if [ "kernel.shmall" -le 4194303 ]; then
    kernel.shmall = 4194304
fi`

2 个答案:

答案 0 :(得分:2)

你可以做这样的事情

 sed -i "s|\("kernel.shmall" *= *\).*|\14194304|" /etc/sysctl.conf

同样可以用于其他属性。

如果属性不存在,那么你可以这样做

if grep -o "kernel.shmall" /etc/sysctl.conf > /dev/null
then
     oldvalue=$(grep kernel.shmall /etc/sysctl.conf | awk '{ print $3 }')

     if [ $oldvalue -lt 4194304 ]
     then
        sed -i "s|\("kernel.shmall" *= *\).*|\14194304|" /etc/sysctl.conf
     fi
else
     echo "kernel.shmall=" >> /etc/sysctl.conf
     sed -i "s|\("kernel.shmall" *= *\).*|\14194304|" /etc/sysctl.conf
fi

答案 1 :(得分:1)

从您的文件中获取值的更简洁方法可能是:

value=$(grep kernel.shmall /etc/sysctl.conf | awk '{ print $3 }')

然后,替换文件中的值:

sed -i "/kernel.shmall =/ s/$value/4194304/" /etc/sysctl.conf