как обработать последние x строк файла - PullRequest
0 голосов
/ 01 октября 2019

Я хочу проанализировать файл журнала для конкретных ошибок. Поэтому я хочу иметь возможность циклически просматривать последние 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

Я надеялся достичь того, что выход исходит из хвостаКоманда будет отделена. Чтобы я мог проверить каждую строку отдельно.

1 Ответ

0 голосов
/ 02 октября 2019

Ваше второе регулярное выражение:

((sftp> ).*|(sftp> bye))

Соответствует следующей строке, поэтому ваша функция возвращает 0:

Werner ist der beste sftp> bye

Так как вы хотите сопоставить следующий шаблон в каждой строке:

sftp> get blahblah/blahblah
sftp> bye

Ваше регулярное выражение должно больше походить на первое, которое вы использовали для сопоставления:

^(sftp> ).*$
...