使用shell命令查看分析日志(2)

目标:

查看日志文件中,所有空指针异常发生的位置,及前后10行,

前10行是为了看到请求的详细信息(接口 ,参数等),

后10行是为了查看异常发生的代码行号,定位代码bug.

命令:

grep -rnw "java.lang.NullPointerException" house_error.log |cut  -d ':' -f 1 |xargs -n1 -i expr  {} + 10 |xargs -i awk '{if(NR>={}-16 && NR<={})print NR":"$0;if(NR=={}) print "\n\n" }'  house_error.log

命令解释: 


使用shell命令查看分析日志(2)
 

命令执行结果:


使用shell命令查看分析日志(2)
 

awk 中:

$0:表示整行;
$1:表示以分隔符分割之后的第一个字段(域);
$2:表示以分隔符分割之后的第二个字段(域);
分隔符:默认是空格,换行,\Tab

awk的内置常量

在awk中有很多的系统变量,这些系统变量在我们编写awk脚本的时候会经常使用到,我现在将经常使用到的系统变量列举出来,并做简要说明。

$0当前记录内容awk '{print $0}'
$1~$n分别保存着当前记录的字段1到字段n的内容awk '{print $1, $2, $3}'
FS字段的分隔符,默认是空格或Tabawk 'BEGIN{FS=":"}{print $1,$3,$6}' /etc/passwd
NF记录当前记录中的字段个数awk '{print $0} END{printf("Total Field(s):%d\n", NF)}' 201509.log
NR已经读出的行数,从1开始计数;对于多个文件的情况下,该值会持续累加awk '{print NR}' 201508.log 201509.log
FNR对于当前处理的文件来说,已经读出的行数;对于多个文件的情况下,该值是各个文件独自对应的行号awk '{print FNR}' 201508.log 201509.log
RS输入的记录分隔符, 默认为换行符awk 'BEGIN{RS=" "}{print FNR}' 201508.log
OFS输出字段分隔符, 默认也是空格awk 'BEGIN{OFS="\t"}{print $1, $2, $3}' 201509.log
ORS输出的记录分隔符,默认为换行符一般用的很少,此处不举例说明了
FILENAME当前输入文件的名字awk '{print FILENAME}' 201509.log

 

注意事项:

expr 算术运算中,运算符两边必须有一个空格

参考:

https://www.tuicool.com/articles/2mqmYbe