在 BASH 中仅在某些行上追加一行

Append a line in BASH only on certain lines

我正在编写脚本以使用 BASH 更改 Nagios 插件服务定义。我需要附加联系人组名称行,但仅适用于某些服务定义。所以我会从这个开始。

define service {
    use                     sites-service
    host_name               my_host
    service_description     check_reboot_os_updates
    check_command           check_reboot_os_updates
    contact_groups          contactgroup1
    servicegroups           MyGroup
    }
    
define service {
        use                     linux-service
        host_name               my_host
        service_description     other_description
        check_command           other_command
        contact_groups          contactgroup1
        servicegroups           MyGroup
        }

而且我只想附加 select 联系人组行。所以说我想像这样向 Linux 服务添加一个额外的联系人组。

define service {
        use                     sites-service
        host_name               my_host
        service_description     check_reboot_os_updates
        check_command           check_reboot_os_updates
        contact_groups          contactgroup1
        servicegroups           MyGroup
        }
        
define service {
        use                     linux-service
        host_name               my_host
        service_description     other_description
        check_command           other_command
        contact_groups          contactgroup1, contactgroup2
        servicegroups           MyGroup
        }

有什么方法可以使用 sed 或 awk 或其他工具来实现吗?

使用 sed,如果字符串 linux-service 是唯一的,您可以尝试从包含该字符串的行匹配到包含字符串 contact_groups 的行,在匹配。

$ sed '/linux-service/,/contact_groups/s/contact_groups.*/&, contactgroup2/' input_file
define service {
        use                     sites-service
        host_name               my_host
        service_description     check_reboot_os_updates
        check_command           check_reboot_os_updates
        contact_groups          contactgroup1
        servicegroups           MyGroup
        }

define service {
        use                     linux-service
        host_name               my_host
        service_description     other_description
        check_command           other_command
        contact_groups          contactgroup1, contactgroup2
        servicegroups           MyGroup

awk '
   == "use" {use = }
  use == "linux-service" &&  == "contact_groups" {[=10=] = [=10=] ", contactgroup2"}
  {print}
' file

要更新文件:

  • gawk -i inplace '...' file
  • awk '...' file | sponge file -- 需要 moreutils
  • f=$(mktemp); awk '...' file > "$f" && mv "$f" file