
Я пишу программу скрипта оболочки для извлечения некоторых исключений из файла журнала и выполнения некоторой обработки. В настоящее время я использую следующую команду в своем скрипте для захвата номеров строк в файле журнала, которые имеют исключение. Строки исключений будут содержать ERROR
keyord сразу после даты и временной метки
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"