Найти строку2, если в файле существует строка1

Для всех, кто столкнулся с этой проблемой, это связано с тем, что на хосте Windows включена проверка подлинности на уровне сети.

0
16.07.2019, 10:49
2 ответа

В ОК:

/^define service/{

    found_command=0
    found_host=0

    while (getline && $0 !~ "^}") {

        # test host
        if($1 == "host_name") {
            if ($2 == new_host) {
                found_host=1
            }else{
                next
            }
        }

        # test check_command
        if($1 == "check_command"){
            cmd = gensub(/^\s*check_command\s*/, "", 1)
            if (cmd == new_command) {
                found_command=1
            }else{
                next
            }
        }
    }

    if (found_command && found_host)
        exit 1
}

можно использовать так:

new_host='...'
new_command='...'
if awk -v new_host="$new_host" -v new_command="$new_command" -f script.awk cfg_file ; then
    echo "you can register it now"
fi
0
28.04.2021, 23:31

Если я правильно понял ваши требования, это похоже на работу, с которой sedможет справиться хорошо благодаря своей способности разграничивать «подпотоки -» в своем входном потоке.

Это должно быть POSIX:

sed -n "/^define service/,/^}/{/^[[:blank:]]\\{1,\}host_name[[:blank:]]\\{1,\\}${V_MAQUINA}/,/^}/{\\%^[[:blank:]]\\{1,\\}check_command[[:blank:]]\\{1,\\}${V_NAGIOS_COMMAND}%{p;q}}}" file

или, если вы можете использовать GNU sed, для меньшего экранирования в строке:

sed -En "/^define service/,/^\\}/{/^[[:blank:]]+host_name[[:blank:]]+${V_MAQUINA}/,/^\\}/{\\%^[[:blank:]]+check_command[[:blank:]]+${V_NAGIOS_COMMAND}%{p;q}}}" file

Объяснение:

sed -En  # use Extended Regular Expressions, and don't print by default

# main `sed` script for entire stream
/^define service/,/^\\}/  # between 'define service' and '}'
{  # sub-stream: between specified 'host_name' and '}'
/^[[:blank:]]+host_name[[:blank:]]+${V_MAQUINA}/,/^\\}/
{  # look for specified 'check_command', using '%' because '/' can be in command
\\%^[[:blank:]]+check_command[[:blank:]]+${V_NAGIOS_COMMAND}%
{p;q}  # if found, print line and quit `sed`
}
}

Это печатает строку check_command, если она найдена в «фрагменте» file, разделенном регулярными выражениями, или вообще ничего, если не найдена.

Таким образом, вы можете просто проверить наличие или отсутствие возвращаемой строки.

Не проверяйте статус выхода, потому что sedвозвращает 0 даже тогда, когда ничего не печатается.

Несколько дополнительных замечаний:

  • нам нужно \\для выражения одного \, потому что мы находимся внутри двойных -кавычек оболочки
  • мы используем двойные -кавычки, чтобы иметь возможность использовать переменные вашей оболочки $V_MAQUINAи$V_NAGIOS_COMMAND
  • Я выбрал %в качестве разделителя регулярного выражения в последнем регулярном выражении, но вы можете выбрать любой символ, который не будет присутствовать в вашей $V_NAGIOS_COMMANDпеременной
0
28.04.2021, 23:31

Теги

Похожие вопросы