在 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
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
我正在编写脚本以使用 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
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