Aggiungere una riga di BASH solo su alcune linee

0

Domanda

Sto lavorando su uno script per apportare modifiche a un plugin di Nagios per la definizione di servizio utilizzo di BASH. Ho bisogno di aggiungere il nome del gruppo di contatti di linea, ma solo per alcune definizioni di servizio. Quindi vorrei iniziare con questo.

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
        }

E voglio aggiungere solo selezionare il gruppo di contatto linee. Diciamo che ho voluto aggiungere un ulteriore gruppo di contatto per i servizi Linux come questo.

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
        }

C'è un modo posso fare questo con l'uso di sed o awk o qualcos'altro?

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

Migliore risposta

2

con

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

Per aggiornare il file:

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

Utilizzando sedse la stringa linux-service è unico, si può provare corrispondenti dalla riga contenente la stringa alla riga contenente la stringa contact_groups aggiungendo l'ulteriore gruppo all'interno della partita.

$ 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

Che ha funzionato perfettamente. L'unica cosa che ho dovuto cambiare è stato aggiungere -io-sed in modo persistente. Grazie per la tua risposta.
Jim Miller

@JimMiller sei il benvenuto. Non ero a conoscenza che il requisito di scuse.
HatLess

nessuna preoccupazione. Mi hai fatto oltre la parte più difficile. Hanno un grande giorno.
Jim Miller

In altre lingue

Questa pagina è in altre lingue

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