Bash-скрипты, за исключением значений

У меня есть сценарий, который копирует строки, начинающиеся с контакта*, из первого файла и вставляет их во второй файл в каждой части файла 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'

но я не могу заставить его работать в моем сценарии, я не знаю, куда его поместить. :/


person MarkoG    schedule 15.03.2018    source источник


Ответы (1)


Я думаю, что мясо вашего скрипта можно написать так:

contacts=$( grep '^[[:blank:]]*contact.' "$1" | sed 's/,xi[[:alpha:]]*//' )
temp=$(mktemp)
awk -v c="$contacts" '$1 == "register" {print c} 1' "$2" > "$temp" && mv "$temp" "$2"
person glenn jackman    schedule 15.03.2018
comment
Мне просто нужно обновить функциональность этого скрипта, чтобы пропустить значения xi*, у меня есть другой скрипт, который вызывает этот. :/ - person MarkoG; 16.03.2018
comment
Я не хочу, чтобы значения с xi* удалялись из первого файла, просто пропускались, чтобы они не добавлялись во второй файл. Первый файл должен остаться прежним, а строки из первого файла, содержащие контакт*, должны быть добавлены ко второму файлу, мне просто нужно пропустить значения xi* в строках контакта* и добавить остальные ко второму файлу в каждая служба определения { часть файла. :D - person MarkoG; 16.03.2018