Я запускаю удаленный исполняемый файл, который создает файл журнала.

Я хочу написать сценарий, чтобы проверить, успешно ли выполняется исполняемый файл или обнаружена ошибка. Я могу это сделать, посмотрев на растущий файл журнала и увидев, появляется ли строка "error" или "success" первой.

Я знаю, что я могу grep файл в режиме реального времени, используя

tail -f output.log | grep --line-buffered "string"

Тем не менее, я могу написать скрипт, который скажет мне, происходит ли grep для "error" или grep для "success" первую очередь?

3 ответа3

0

Вы можете сделать это, только посмотрев на первый результат, возвращаемый grep , например, с помощью head -n1:

status=$(grep -o 'success\|error' output.log | head -n1)
if [[ $status == "success" ]]; then
    # Program started successfully
else
    # Program encountered an error
fi
0

Найдите обе строки с помощью grep, извлеките номера строк первого совпадения и сравните значения.

  • Параметр grep -n дает номер строки любых совпадений.
  • Опция -m1 отображает только первое совпадение и затем завершается.
  • кстати опция -F fast grep - может быть полезна, если в строке поиска не требуются регулярные выражения.

Пример вывода из ошибки grep будет выглядеть примерно так - строка 235 должна быть извлечена из вывода.

235:[Wed Jun 04 12:23:19 2014] [error] child pid 6575 Segmentation fault (11)

Номера строк можно извлечь, удалив самую длинную подстроку соответствия %%:.* Из выходных данных, чтобы оставить числовые значения, которые сравниваются в операторе if.

er_match=$(tail -f output.log | grep -n -F -m1 --line-buffered "error")
ok_match=$(tail -f output.log | grep -n -F -m1 --line-buffered "success")

if [[ ${er_match%%:.*} - gt ${ok_match%%:.*} ]];then
    echo "error first"
else
    echo "sucess first"
fi
0

Если вы используете egrep, вы можете проверить любую строку в каждой строке:

egrep 'success|failure'

Это выведет строки по порядку, и вы можете направить вывод во что-то, чтобы выбрать первую строку.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .