2011-10-20 97 views
0

我有一個如下例所示的配置文件。有一系列按主機名分組的定義。我只是將「cpu-service」定義添加到一個主機「母艦」中。現在我需要在同一個文件中做到100+以上。我已經完成的工作是從配置文件中刪除所有預先存在的主機名(100+)。因此,現在我有一個文件,其中包含現在需要cpu-service定義註釋的服務器列表。他們已經有了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 

注意您可能會收到空白/後換行的問題。

+0

我在哪裏可以引用host.txt文件?是-i .bak - myconfig.cfg.bak? –

+0

也許我不清楚。定義CPU服務不是除了「母親」之外的任何東西,其他100多臺服務器只定義了ping服務。所以這不起作用? –

+0

@ZackLee更新後的答案可能更接近你之後的內容? – Benjie

1

雖然我有輕微的感覺,做你的工作,嘗試下面的腳本:

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

一個權衡:不知怎的,我得到一個結尾的「}」,但它是不值得擔心,除非你一定要每天做 - 只需用編輯器將其刪除即可。

像往常一樣與AWK:如果您的供應商船AWK的歷史版本,你可能需要使用NAWK

1

三個步驟老總:

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
while read name;做hostup.sh $ name;完成< hostnames.txt
while read name;做hostup.sh $ name;完成< hostnames.txt >> hosts.conf

+0

謝謝mmrtnt。幾乎可以達到我需要的程度。但是,我已經有了定義服務的母親,母親,母親和母親。所以我真的需要在那些已經存在的定義上插入cpu-service ontop。這非常接近。 –