
Estoy escribiendo un programa de script de shell para extraer algunas excepciones de un archivo de registro y realizar algún procesamiento. Actualmente estoy usando el siguiente comando en mi script para capturar los números de línea en el archivo de registro que tiene una excepción. Las líneas de excepción contendrán ERROR
la palabra clave justo después de la fecha y la marca de tiempo.
lineNos=($(grep -n ERROR $file | grep Exception | cut -d':' -f1 | tail -3))
Mientras probaba el script actual, noté que algunas entradas del registro contienen ERROR y Excepciones en la misma fila, pero en realidad no es el tipo de ERROR que estoy buscando (ejemplo línea 5). Me gustaría modificar mi script de tal manera. que devolverá solo la línea número 3 en el siguiente registro de ejemplo.
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:
Respuesta1
Si desea obtener las líneas con las palabras ERROR
y Exception
, intente:
grep -E "ERROR.*Exception" $file
Respuesta2
Si usa awk
en lugar de grep
, no solo puede imprimir solo los números de línea (más precisamente,números récord) directamente, pero también prueba campos específicos delimitados por espacios en blanco individualmente, por ejemplo
awk '$3 == "ERROR" && /Exception/ {print NR}' logfile
o (aún más específicamente, limitar el partido Exception
al campo final)
awk '$3 == "ERROR" && $NF ~ /Exception/ {print NR}' logfile
Respuesta3
cat thelogfile.log | nl -ba | grep "ERROR"
Esto canalizará el archivo a nl a líneas numéricas, luego filtrará con grep las líneas de error. Si solo desea los números de línea de error, agregue awk '{print $1}'. También cat puede alinear números con el indicador -n, pero yo prefiero nl.
ejemplo de una variable de matriz de números de línea con errores;
linenos=($(cat -n thelogfile.log | grep "ERROR" | awk '{print $1}' | tr "\n" " " | sed 's/$/\n/'))
Editar:
ps el grep puede ser;
grep ",[0-9]* ERROR"
Respuesta4
Usando expresiones regulares más específicas:
grep '^[0-9, :-]\+ERROR' "$file"