【问题标题】:Sed/Awk script to append/insert?用于追加/插入的 Sed/Awk 脚本?
【发布时间】:2011-12-11 20:46:07
【问题描述】:

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

是否有我可以用来完成此类工作的 sed/awk 脚本。基本上我可能需要编写一个带有定义部分的 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
}

【问题讨论】:

    标签: perl bash sed awk vi


    【解决方案1】:

    虽然我对做你的工作有一点感觉,但试试下面的脚本:

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

    一个权衡:不知何故我得到一个尾随的“}”,但不值得担心,除非你必须每天都这样做 - 只需使用编辑器将其删除。

    一如既往地使用 awk:如果您的供应商提供了历史版本的 awk,您可能希望使用 nawk。

    【讨论】:

      【解决方案2】:

      三步法师:

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

      母舰
      母载
      贝母
      妈妈们

      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
      同时读取名称;做hostup.sh $name;完成 同时读取名称;做hostup.sh $name;完成 > hosts.conf

      【讨论】:

      • 谢谢mmrtnt。几乎到了我需要它的地步。但是,我已经定义了 ping 服务的 momload、motherofpeal、mothersbaugh。所以我真的需要在那些已经存在的定义之上插入 cpu-service 。这真的很接近。
      【解决方案3】:

      Sed 可以插入换行符,只需用反斜杠转义它们 - 例如以下将遍历您的“主机”文件中的每一行,并将其替换为 cpu 服务的完整定义。我不确定这是否正是您想要的。

      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
      

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

      【讨论】:

      • 我应该在哪里引用我拥有的 host.txt 文件?是 -i .bak - myconfig.cfg.bak 吗?
      • 也许我也不清楚。除了“母舰”之外,define cpu 服务没有任何意义。其他 100 多台服务器只定义了 ping-service。所以这行不通?
      • @ZackLee 更新后的答案可能更接近您所追求的?
      猜你喜欢
      • 2011-02-22
      • 2016-10-30
      • 1970-01-01
      • 1970-01-01
      • 2018-07-02
      • 2013-08-17
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      相关资源
      最近更新 更多