2011-10-20 11 views
0

私は以下の例のような構成ファイルを持っています。ホスト名でグループ化された一連の定義があります。私はちょうど1つのホスト "母船"に "cpu-service"の定義を追加しました。今私は同じファイルで100以上のことをする必要があります。私がすでに行っていることは、configファイルからすべての既存のホスト名(100+)を抹消したものです。だから、今私はcpuサービス定義のコメントを持つ必要があるサーバーのリストを持つファイルがあります。彼らはすでにpingサービスを持っているので、私はちょうどそれぞれにcpuサービスを追加したいと思っています。明らかに手でこれを手動で行うのは面倒です。追加/挿入するSed/Awkスクリプト?

このタイプの作業を行うために使用できるsed/awkスクリプトはありますか?基本的には、define部分でskelファイルを作成し、host_nameを空白のままにする必要があります。次に、host.txtファイルをそれに送ります。私はおそらくいくつかのVIトリッキーでこれをハックすることができます。わからない?

ありがとうございます!


define{ 
     use        cpu-service 
     host_name      mothership 
     contact_groups     systems manager 
} 
define{ 
     use        ping-service 
     host_name      mothership 
     contact_groups     systems manager 
} 

答えて

1

Sedでは改行を挿入できますが、バックスラッシュでエスケープすることができます。以下はあなたの 'hosts'ファイルの各行を通り、それをcpu-serviceの完全な定義に置き換えます。これがあなたが望むものなのかどうかは分かりません。

sed -e 's/^(.*)$/define{\ 
    use        cpu-service\ 
    host_name      \1\ 
    contact_groups     systems manager\ 
}/g' hosts.txt > new_directives 

あなたはnew_directivesに満足しているならば、あなただけの

cat new_directives >> config_file 

NOTE空白/末尾の改行の問題を取得することができます。

+0

私が持っているhost.txtファイルはどこにありますか? -i .bak - myconfig.cfg.bakですか? –

+0

また、私は明らかではないかもしれません。 define cpuサービスは "mothership"以外には存在しません。他の100以上のサーバーには、ping-serviceだけが定義されています。これはうまくいかないでしょうか? –

+0

@ZackLee更新された回答は、あなたの後ろに近いかもしれませんか? – Benjie

1

私はあなたの仕事をするためにわずかな感覚を得ますが、以下のスクリプトを試してみてください。

awk ' 
BEGIN { 
     RS = ORS = "}\n" 
     FS = "\n" 
} 
NF > 0 { 
     print 
     if (sub(/ping-service/, "cpu-service")) print 
} 
' file 

一つのトレードオフ:どういうわけか私は「}」の末尾を取得するが、それはあなたが持っていない限り、心配を価値はありません毎日それを作ってください。それをエディタで削除してください。ベンダーの船もしあなたがのnawkを使用したい場合がありのawkの歴史的なバージョン:のawkといつものように

1

3人のステップのだんな:

1:ホスト名ファイル(hostnames.txt)

母船
motherload
motherofpeal
マザーズ

2:スクリプト(hostup.sh)

#!/bin/bash 

HOSTNAME=$1 

TEMPLATE=" 
define{ 
     use        cpu-service 
     host_name      ${HOSTNAME} 
     contact_groups     systems manager 
} 
define{ 
     use        ping-service 
     host_name      ${HOSTNAME} 
     contact_groups     systems manager 
}" 

echo "${TEMPLATE}" 

3:コマンドライン

chmod + x hostup.sh
read name; hostup.sh $ nameを実行します。 done < hostnames.txt
読み取り名です。 hostup.sh $ nameを実行します。 done < hostnames.txt >> hosts.conf

+0

ありがとうございましたmmrtnt。私が必要とするところまでほとんど働きます。しかし、私はすでにping-serviceが定義されている、マザーロード、モテロフェア、マザーバウを持っています。ですから、実際にはすでに存在する定義のcpu-service ontopを挿入する必要があります。これは本当に近いです。 –

関連する問題