Поиск в лог-файле - код выхода

У меня есть несколько устаревших программ, которые мне нужно автоматизировать под Control-M. Эти работы находятся под Windows 2008R2.

Эти задания имеют код завершения 0, если они выполняются нормально, но также и если они могут справиться с некоторыми ошибками. Мне нужно поднять тревогу, когда конкретная строка в журнале.
Строка не находится в выводе исполняемого файла.

Я реализовал другую работу для этого. Идет поиск строки в файле, и в "Действиях при выполнении" я ищу оператор.

Чтобы иметь утверждение в выводе, я думаю использовать что-то вроде grep. Я использовал:

  • findstr

    findstr "myerrorcode" D:\Log\greptest_%%$ODATE..log
    
  • grep под Cygwin

В обоих случаях у меня одинаковая ситуация:

  • Если строка найдена, все в порядке
  • Если файл не найден или не может быть открыт, grep или findstr возвращают код выхода = 1. Это нормально, потому что задание должно вызвать ошибку.

Но проблема в том, что когда строка не найдена в файле, и grep, и findstr имеют код возврата = 1.

Как я могу различить случаи, когда файл не может быть открыт и когда все работает нормально, но sring в журнале не найден?

2 ответа

Вы должны быть в состоянии использовать grep выходной статус, чтобы определить причину сбоя. По данным POSIX grep документы, раздел статуса выхода:

EXIT STATUS

   The following exit values shall be returned:

   0    One or more lines were selected.
   1    No lines were selected.
   >1   An error occurred.

Это похоже на GNU grep (последовательно, но более конкретно):

Обычно статус выхода равен 0, если линия выбрана, 1, если линии не выбраны, и 2, если произошла ошибка. [...] Другие реализации grep могут завершиться со статусом больше 2 в случае ошибки.

Например, в bash Вы могли бы использовать case Команда для обработки нескольких веток, как это:

#!/bin/bash

# search for error code in file
grep code file

# store the exit status in variable err
err=$?

# test several cases
case $err in
    0) echo All good.;;
    1) echo Code not found.;;
    *) echo Error reading from file.;;
esac

Вы можете легко справиться с этим в Control-M: добавить на вкладку "Действие"

  1. Добавить "On Do Action"
  2. On: "Конкретный вывод оператора"
  3. Заявление (как состояние документации Control-M):

Строка символов длиной от 1 до 132 символов, содержащая оператор из файла сценария задания. Указанная строка может быть частью оператора.

Каждая строка символов оператора может содержать символы маски. Допустимые символы маски:

* – represents any number of characters (including no characters)
$ – represents any single character
? – represents any single character
  1. Код:

Символьная строка длиной от 1 до 255 символов для сравнения с ответом операционной системы на указанный оператор.

Каждая строка символов кода может содержать символы маски. Допустимые символы маски:

* – represents any number of characters (including no characters)
$ – represents any single character
? – represents any single character

Пример: On Do Action Control-M 8

Другие вопросы по тегам