Добавляйте строку в BASH только в определенные строки

0

Вопрос

Я работаю над сценарием для внесения изменений в определение сервиса плагинов Nagios с помощью BASH. Мне нужно добавить строку имени контактной группы, но только для определенных определений служб. Поэтому я бы начал с этого.

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
        }

И я хочу добавить только выбранные строки контактной группы. Итак, скажем, я хотел добавить дополнительную контактную группу в службы 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 или чего-то еще?

awk bash nagios sed
2021-11-23 20:51:30
2

Лучший ответ

2

с

awk '
  $1 == "use" {use = $2}
  use == "linux-service" && $1 == "contact_groups" {$0 = $0 ", contactgroup2"}
  {print}
' file

Чтобы обновить файл:

  • gawk -i inplace '...' file
  • awk '...' file | sponge file -- требуется moreutils пакет
  • f=$(mktemp); awk '...' file > "$f" && mv "$f" file
2021-11-23 21:28:53
0

С помощью 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
2021-11-23 21:19:20

Это сработало идеально. Единственное, что мне нужно было изменить, это добавить-я после sed, чтобы это сохранилось. Спасибо вам за ваш ответ.
Jim Miller

@Джиммиллер, пожалуйста. Я не знал о требовании на месте, приношу свои извинения.
HatLess

не беспокойтесь. Ты помог мне преодолеть самую трудную часть. Хорошего вам дня.
Jim Miller

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................