Je transfère certaines anciennes données de configuration Nagios de Nagios Core à Nagios XI. Une partie de ce travail signifie que j'ai besoin d'extraire certaines définitions d'objets et de les placer dans des fichiers individuels nommés par nom d'hôte (exemple à suivre). Je peux voir un certain nombre de façons de le faire, éventuellement en écrivant un script (Perl/Python/PHP - le script Nagios XI semble être fait en PHP). Cependant, je me demandais s'il y avait une façon plus simple de le faire, peut-être sur la ligne de commande en utilisant awk
ou similaire? Il me semble que awk peut facilement extraire des lignes de texte entre deux motifs de délimitation (par exemple, /define host \{/
et /\}/
) mais j'ai besoin que la sortie se sépare en fichiers individuels nommés par le contenu du champ nom_hôte.Extraction des définitions d'objets Nagios d'un fichier de configuration monolithique vers des fichiers individuels
Quelle est la meilleure approche pour cela? Est-ce que je préfère écrire un script, ou est-ce qu'il y a une commande awk (ou similaire) qui peut être exécutée à partir du shell bash sur les machines Nagios XI?
Exemple de fichier monolithique:
define host {
host_name testhost1
use hosttemplate1
address 10.0.0.1
host_groups +linux,all
contact_groups +servicedesk
alias testhost1
icon_image redhat_icon.png
}
define service {
use servtemplate1
host_name testhost1
service_groups +All
service_description A Test Service
}
define host {
host_name testhost2
use hosttemplate2
address 10.0.0.2
host_groups +linux,all
contact_groups +servicedesk
alias testhost2
icon_image redhat_icon.png
}
sortie souhaitée:
# cat testhost1.cfg
define host {
host_name testhost1
use hosttemplate1
address 10.0.0.1
host_groups +linux,all
contact_groups +servicedesk
alias testhost1
icon_image redhat_icon.png
}
# cat testhost2.cfg
define host {
host_name testhost2
use hosttemplate2
address 10.0.0.2
host_groups +linux,all
contact_groups +servicedesk
alias testhost2
icon_image redhat_icon.png
}
Maintenant, par exemple, je peux exécuter une commande comme celui-ci qui semble utilisé assez largement pour l'extraction de la ligne:
# gawk ' /define host/{flag=1;next} /}/{flag=0} flag { print }' example.cfg
Cela coupe le define host
et }
mais c'est une solution relativement facile - cependant, elle produit les données sous la forme d'un flux dans le shell.
Y at-il un truc intelligent que je peux mettre en œuvre pour faire tout cela, y compris la division en fichiers de configuration individuels à partir d'un seul revêtement sur le shell, ou devrais-je écrire un script?
Curieux de savoir pourquoi ma question downvoted que je suis nouveau ici - les solutions semblent avoir aidé d'autres au-delà de moi-même que le fait de façon pas en soi faire de la question de la valeur ? Si je comprends la raison alors je ferai en sorte que les futures questions soient meilleures. Je vous remercie! –