查找日志文件中异常行的行号

查找日志文件中异常行的行号

我正在编写一个 shell 脚本程序来从日志文件中提取一些异常并进行一些处理。目前,我在脚本中使用以下命令来捕获日志文件中出现异常的行号。例外行将包含ERROR日期和时间戳之后的关键字

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

在测试当前脚本时,我注意到某些日志条目在同一行中包含错误和异常,但这实际上不是我正在寻找的错误类型(示例第 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"

相关内容