要添加/插入的Sed / Awk脚本?

时间:2011-10-20 14:39:46

标签: perl bash sed awk vi

我有一个配置文件,如下例所示。有一系列按主机名分组的定义。我刚刚将“cpu-service”定义添加到一个主机“motherhip”中。现在我需要在同一个文件中再多做100多个。我已经完成的工作是从配置文件中删除所有预先存在的主机名(100+)。所以现在我有一个文件,其中包含现在需要让cpu-service定义注释的服务器列表。他们已经有ping服务,所以我只想为每个人添加cpu-service。显然,手动手动操作将是乏味的。

是否有可用于执行此类工作的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
}

3 个答案:

答案 0 :(得分: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

注意您可能会遇到空白/尾随换行问题。

答案 1 :(得分:1)

虽然我对你的工作有轻微的感觉,但请尝试以下脚本:

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

一个权衡:不知怎的,我得到一个尾随“}”,但不值得担心,除非你每天都要这样做 - 只需用编辑器删除它。

awk 一样:如果您的供应商提供 awk 的历史版本,您可能需要使用 nawk

答案 2 :(得分:1)

先生三步:

1:主机名文件(hostnames.txt)

母船
motherload
motherofpeal
motherbaugh

2:script(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
而读名; do hostup.sh $ name;完成< hostnames.txt
而读名; do hostup.sh $ name;完成< hostnames.txt>> hosts.conf