1

我有一个问题需要帮助。我正在编写一个脚本来更改文件示例中的参数

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

defaults
  mode http
  retries 3
  maxconn 2000

我想将全局中的 maxconn 更改为 10000,并将默认值中的 maxconn 保持为 2000,但是当我通过命令 sed 更改全局中的 maxconn 时,默认值中的 maxconn 也发生了变化。请帮我!

4

3 回答 3

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
于 2013-08-26T15:08:19.117 回答
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 中。

于 2013-08-26T15:07:56.490 回答
0

这可能对您有用(GNU sed):

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

这会寻找一行开始global,然后打印该行以及下一行和下一行等,直到当前行包含maxconn它替换新值并且循环被打破。

于 2013-08-26T18:40:37.337 回答