Dodaj wiersz w BASH tylko w niektóre wiersze

0

Pytanie

Pracuję nad scenariuszem do wprowadzania zmian w definicji usługi wtyczek administracyjna odpala nagios z pomocą BASH. Muszę dodać wiersz nazwy grupy kontaktowej, ale tylko dla niektórych definicji usług. Więc ja bym zaczął od tego.

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
        }

I chcę dodać tylko wybrane wiersze grupy kontaktowej. Tak więc, powiedzmy, chciałem dodać dodatkowe dane kontaktowe grupy usługi Linux, takie jak ten.

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
        }

Czy istnieje sposób, aby zrobić to za pomocą sed, awk, czy coś jeszcze?

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

Najlepsza odpowiedź

2

z

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

Aby zaktualizować plik:

  • gawk -i inplace '...' file
  • awk '...' file | sponge file -- chcesz moreutils pakiet
  • f=$(mktemp); awk '...' file > "$f" && mv "$f" file
2021-11-23 21:28:53
0

Z pomocą sedjeśli ciąg linux-service jest wyjątkowy, można spróbować porównać wiersz zawierający ciąg znaków, z ciągiem zawierającym ciąg znaków contact_groups dodanie dodatkowej grupy w meczu.

$ 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

Zadziałało idealnie. Jedyne co musiałem zmienić to dodać-ja po sed, aby to przetrwało. Dziękuję ci za odpowiedź.
Jim Miller

@Джиммиллер, proszę. Nie wiedziałem o żądaniu na miejscu, przepraszam.
HatLess

nie martw się. Ty pomógł mi pokonać najtrudniejszą część. Miłego dnia.
Jim Miller

W innych językach

Ta strona jest w innych językach

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