Ajouter une ligne dans BASH uniquement sur certaines lignes

0

La question

Je suis en train de travailler sur un script pour faire des modifications à un Nagios plugin définition du service à l'aide de BASH. J'ai besoin d'ajouter le groupe de contact de la ligne de nom mais seulement pour certaines définitions de service. Je voudrais donc commencer par cela.

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
        }

Et je tiens à ajouter uniquement sélectionner le groupe de contact des lignes. Donc, dire que je voulais ajouter un autre groupe de contact pour le Linux des services de ce genre.

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
        }

Est il possible que je peux le faire à l'aide de sed ou awk ou autre chose?

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

La meilleure réponse

2

avec

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

Pour mettre à jour le fichier:

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

À l'aide de sedsi la chaîne linux-service est unique, vous pouvez essayer de correspondance à partir de la ligne contenant la chaîne de caractères à la ligne contenant la chaîne de caractères contact_groups ajoutant des supplémentaires de groupe dans le match.

$ 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

Cela a parfaitement fonctionné. La seule chose que j'ai dû changer était add -je après sed si elle persiste. Je vous remercie pour votre réponse.
Jim Miller

@JimMiller Vous êtes les bienvenus. Je n'étais pas au courant de la en place exigence, des excuses.
HatLess

pas de soucis. Tu m'as eu sur la partie la plus difficile. Avoir un grand jour.
Jim Miller

Dans d'autres langues

Cette page est dans d'autres langues

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