Я хочу проанализировать файл журнала для конкретных ошибок. Поэтому я хочу иметь возможность циклически просматривать последние x строк файлов и проверять каждую строку с определенным шаблоном REGEX, а затем определять конкретное возвращаемое значение.
Файл журнала В момент успеха выглядит следующим образом, когда я хочу его проверить.
….
sftp> get blahblah/blahblah
sftp> bye
В случае ошибки что-то находится между двумя строками sftp.
Я уже пытался решить проблему с помощью специального регулярного выражения, которое отлично работало на некоторых онлайн-тестерах регулярных выражений, но не могло заставить его работать в ksh.
Мой текущий подход следующий:
LOG_FIL="test_log"
MODE="${1}"
check_log_file() {
ERRNBR=${1}
REGEX=${2}
TAIL=${3}
RETURN="0"
echo "ERRNBR = ${ERRNBR}"
echo "REGEX = ${REGEX}"
echo "TAIL = ${TAIL}"
while read line; do
echo "${line}"
if [[ "${line}" =~ ${REGEX} ]]; then
RETURN="0"
echo "bin hier"
else
RETURN=${ERRNBR}
echo "bin wo anders"
break
fi
done <<<$(tail -${TAIL} ${LOG_FIL})
echo "${RETURN}"
return ${RETURN}
}
echo "sftp> get cwi/cdk_final*" >> ${LOG_FIL}
if [ "${MODE}" == "1" ]; then
echo "Werner ist der beste" >>${LOG_FIL}
fi
check_log_file "22" "^(sftp> ).*$" "1"
echo "$?"
echo "sftp> bye" >> ${LOG_FIL}
check_log_file "21" "((sftp> ).*|(sftp> bye))" "2"
echo "$?"
Я получил следующие результаты:
edv> sh cdk_test4sftp.sh 1
ERRNBR = 22
REGEX = ^(sftp> ).*$
TAIL = 1
Werner ist der beste
bin wo anders
22
22
ERRNBR = 21
REGEX = ((sftp> ).*|(sftp> bye))
TAIL = 2
Werner ist der beste sftp> bye
bin hier
0
0
Я надеялся достичь того, что выход исходит из хвостаКоманда будет отделена. Чтобы я мог проверить каждую строку отдельно.