Añadir una línea en BASH sólo en ciertas líneas

0

Pregunta

Estoy trabajando en un script para hacer cambios a un Nagios plugin de la definición de servicio usando BASH. Necesito anexar el grupo de contacto nombre de la línea, pero sólo para ciertas definiciones de servicio. Así que me gustaría empezar con este.

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
        }

Y quiero anexar sólo seleccione el grupo de contacto de las líneas. Así que decir que yo quería agregar un grupo de contacto para los servicios de Linux como este.

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
        }

Hay una manera que puedo hacerlo con sed o awk o algo más?

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

Mejor respuesta

2

con

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

Para actualizar el archivo:

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

El uso de sedsi la cadena linux-service es único, usted puede intentar la coincidencia de la línea que contiene la cadena a la línea que contiene la cadena contact_groups anexar el grupo adicional en el partido.

$ 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

Que funcionó a la perfección. La única cosa que tenía que cambiar era add -i después de sed por lo que se conservan. Gracias por tu respuesta.
Jim Miller

@JimMiller eres bienvenido. Yo no era consciente de la exigencia, disculpas.
HatLess

no se preocupe. Me tienes sobre la parte más difícil. Que tengan un gran día.
Jim Miller

En otros idiomas

Esta página está en otros idiomas

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