我有一个问题需要帮助。 我正在写一个脚本来更改文件示例中的参数
global
maxconn 4096
pidfile /var/run/haproxy.pid
daemon
defaults
mode http
retries 3
maxconn 2000
我想将全局的maxconn更改为10000并将maxconn保持为默认值为2000但是当我通过命令sed更改globalconn时,默认值中的maxconn也会更改。请帮帮我!
答案 0 :(得分: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”只是一些名为tac文件的名称,例如/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
答案 1 :(得分: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中。
答案 2 :(得分:0)
这可能适合你(GNU sed):
sed -r '/^global/{:a;n;s/^(\s*maxconn ).*/\110000/;Ta}' file
这将查找以global
开头的行,然后打印该行以及下一行等,直到当前行包含maxconn
时,它替换新值并且循环被破坏。