1

助けが必要な問題が 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」は/usr/tmp/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

これはうまくいくかもしれません(GNU sed):

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

これは、最初の行を探し、globalその行とその次の行、次の行などを出力し、現在の行がmaxconn新しい値に置き換えられてループが壊れるまで続きます。

于 2013-08-26T18:40:37.337 に答える
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 に答える