У меня есть сценарий, который копирует строки, начинающиеся с контакта*, из первого файла и вставляет их во второй файл в каждой части файла define service{. Первый файл выглядит так:
define host {
host_name 10.80.12.53
use xiwizard_passive_host
address 10.80.12.53
check_command check-host-alive!!!!!!!!
max_check_attempts 5
check_interval 5
retry_interval 1
check_period xi_timeperiod_24x7
contacts Marko Geršić,Mijo,nagiosadmin,Patrick,ximgersic
contact_groups UNIX
notification_interval 60
notification_period xi_timeperiod_24x7
icon_image passiveobject.png
statusmap_image passiveobject.png
_xiwizard passiveobject
register 1
}
И второе:
define service {
host_name 10.80.12.53
service_description Service Status - mysqld2
use local-service
check_command check_xi_service_status!mysqld!!!!!!!
register 1
}
define service {
host_name 10.80.12.53
service_description Service Status - npcd
use local-service
check_command check_xi_service_status!npcd!!!!!!!
register 1
}
Когда я запускаю скрипт, строки contact* из первого файла добавляются ко второму файлу, и результат такой:
define service {
host_name 10.80.12.53
service_description Service Status - mysqld2
use local-service
check_command check_xi_service_status!mysqld!!!!!!!
contacts Marko Geršić,Mijo,nagiosadmin,Patrick,ximgersic
contact_groups UNIX
register 1
}
define service {
host_name 10.80.12.53
service_description Service Status - npcd
use local-service
check_command check_xi_service_status!npcd!!!!!!!
contacts Marko Geršić,Mijo,nagiosadmin,Patrick,ximgersic
contact_groups UNIX
register 1
}
Вот сценарий:
#!/bin/bash
shopt -s extglob
if (( $# != 2 )); then
echo Usage: nagios-contacts.sh host-file service-file >&2
exit 1
fi
declare -A CONFIG CONFIGS
while read KEY VALUE; do
[[ $KEY == contact@(s|_groups) ]] && CONFIG[$KEY]="$VALUE"
done <$1
while read LINE; do
if [[ $LINE == *"define service {"* ]]; then
for KEY in ${!CONFIG[*]}; do
CONFIGS[$KEY]=0
done
elif [[ $LINE == *}* ]]; then
for KEY in ${!CONFIG[*]}; do
[[ ${CONFIGS[$KEY]} == 1 ]] && unset CONFIGS[$KEY]
done
for KEY in ${!CONFIGS[*]}; do
echo $KEY ${CONFIG[$KEY]}
done
unset CONFIGS
declare -A CONFIGS
elif [[ $LINE == *contact@(s|_groups)* ]]; then
read KEY VALUE <<<"$LINE"
CONFIGS[$KEY]=1
LINE="$LINE,${CONFIG[$KEY]}"
fi
echo "$LINE"
done <$2 | tee $2.new
mv $2.new $2
echo Saved output to $2.new
Второй файл должен выглядеть так:
define service {
host_name 10.80.12.53
service_description Service Status - mysqld2
use local-service
check_command check_xi_service_status!mysqld!!!!!!!
contacts Marko Geršić,Mijo,nagiosadmin,Patrick
contact_groups UNIX
register 1
}
define service {
host_name 10.80.12.53
service_description Service Status - npcd
use local-service
check_command check_xi_service_status!npcd!!!!!!!
contacts Marko Geršić,Mijo,nagiosadmin,Patrick
contact_groups UNIX
register 1
}
Итак, без xi* в контактных* линиях. Я хотел бы добавить в свой скрипт, чтобы пропускать значения с xi* из первого файла и не добавлять их во второй. :/
Я знаю, что могу добиться этого с помощью sed ->
sed '/контакт*/s/xi[^ ]*//g'
но я не могу заставить его работать в моем сценарии, я не знаю, куда его поместить. :/