2013-08-26 37 views
1

我有一个问题需要帮助。 我书面方式脚本来更改参数文件的例子如何更改文件中只有一个参数

global 
    maxconn 4096 
    pidfile /var/run/haproxy.pid 
    daemon 

defaults 
    mode http 
    retries 3 
    maxconn 2000 

我想在全球改变MAXCONN到10000,并保持在MAXCONN默认是2000,但是当我通过命令全球MAXCONN改变的sed,MAXCONN违约率也改变了。请帮帮我!

回答

1

sed的是简单的换人在一行上,但为别的只用awk一个极好的工具:

$ awk -v RS= -v ORS='\n\n' '/^global/{ sub(/maxconn[^\n]+/,"maxconn 10000") }1' file 
global 
    maxconn 10000 
    pidfile /var/run/haproxy.pid 
    daemon 

defaults 
    mode http 
    retries 3 
    maxconn 2000 

要编写一个命令的输出(AWK或其他)回到原来的文件:

command file > tmp && mv tmp file 

“tmp”只是一些tmp文件,名称无论如何,无论你在哪里,例如/usr/tmp/tmp$$

因此,对于这个特定的命令,你可以这样做:

awk -v RS= -v ORS='\n\n' '/^global/{ sub(/maxconn[^\n]+/,"maxconn 10000") }1' file > /usr/tmp/tmp$$ && mv /usr/tmp/tmp$$ file 
+0

+1,以及如何增加'space'或'\ s'来创建'maxconn \ s [^ \ n] +',以便区分'maxconn xxx'和'maxconn2 xxx'? – Kent

+0

有可能,OP可以决定他们是否想这样做。我不会使用'\ s',因为它不可移植,我会使用'[[:blank:]]''。 (S)他可能也想考虑调整'newmaxconn'或类似的 - 我们会看看OP是否提供任何其他输入来考虑。 –

+0

是'[[:blank:]]'更好!真正的主人不会忽视一件小事。 – Kent

0

这个怎么样?

#!/bin/bash 

if [ ! $# -eq 1 ]; then 
    echo "Wrong number of parameters" 
    exit 
fi 

awk -v new_value=$1 '{ 
    if ($2 == "") 
      global = ($1 == "global"); 

    if ($1 == "maxconn" && global) { 
      printf " maxconn %s\n", new_value; 
    } else { 
      print $0; 
    } 
}' 

要运行执行:

./change.sh 10000 < conf.txt 

我假设上面的脚本名为change.sh和你输入保存在conf.txt。

0

这可能会为你工作(GNU SED):

sed -r '/^global/{:a;n;s/^(\s*maxconn).*/\110000/;Ta}' file 

这看起来对于开始global一条线,然后打印该行和下一和下一个等,直到当前行包含maxconn,当它替换新值并且循环被破坏时。

+0

哦,谢谢你!我想问为什么值“110000”? –

+0

@ user2709443不是,第一个'1'实际上是'\ 1',并且是对'maxconn'字符串的反向引用。 – potong

相关问题