Найдите номера строк исключений в файле журнала.

Найдите номера строк исключений в файле журнала.

Я пишу программу скрипта оболочки для извлечения некоторых исключений из файла журнала и выполнения некоторой обработки. В настоящее время я использую следующую команду в своем скрипте для захвата номеров строк в файле журнала, которые имеют исключение. Строки исключений будут содержать ERRORkeyord сразу после даты и временной метки

lineNos=($(grep -n ERROR $file | grep Exception | cut -d':' -f1 | tail -3))

При тестировании текущего скрипта я заметил, что некоторые записи журнала содержат ERROR и Exceptions в одной строке, но это на самом деле не тот тип ERROR, который я ищу (пример строки 5). Я хотел бы изменить свой скрипт таким образом, чтобы он возвращал только строку номер 3 в приведенном ниже примере журнала.

2016-10-21 15:25:37,231 INFO Processinng current row  
2016-10-21 15:25:37,231 INFO com.test.main com.test.controller.CrashException: 
2016-10-21 15:25:37,231 ERROR com.test.main com.test.controller.CrashException: 
2016-10-21 15:25:37,231 DEBUG com.test.main com.test.controller.CrashException: 
2016-10-21 15:25:37,231 DEBUG Processing row with ERROR and Exception 
2016-10-21 15:25:37,231 DEBUG processed row 1: 

решение1

Если вы хотите получить строки со словами ERRORи Exception, попробуйте:

grep -E "ERROR.*Exception" $file

решение2

Если вы используете awkвместо grep, вы можете не только вывести только номера строк (точнее,рекордные цифры) напрямую, но и тестировать отдельные поля, разделенные пробелами, по отдельности, например

awk '$3 == "ERROR" && /Exception/ {print NR}' logfile

или (еще более конкретно - ограничение соответствия Exceptionфинальным полем)

awk '$3 == "ERROR" && $NF ~ /Exception/ {print NR}' logfile

решение3

cat thelogfile.log | nl -ba | grep "ERROR"

Это перенаправит файл в nl для нумерации строк, а затем отфильтрует с помощью grep строки с ошибками. Если вам нужны только номера строк с ошибками, добавьте awk '{print $1}'. Также cat может нумеровать строки с помощью флага -n, но я предпочитаю nl.

пример для массива переменных номеров строк с ошибками;

linenos=($(cat -n thelogfile.log | grep "ERROR" | awk '{print $1}' | tr "\n" " " | sed 's/$/\n/'))

Редактировать:

ps grep может быть;

grep ",[0-9]* ERROR"

решение4

Используя более конкретное регулярное выражение:

grep '^[0-9, :-]\+ERROR' "$file"

Связанный контент