我正在编写一个 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"