使用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
命令解释:
命令执行结果:
awk 中:
$0:表示整行;
$1:表示以分隔符分割之后的第一个字段(域);
$2:表示以分隔符分割之后的第二个字段(域);
分隔符:默认是空格,换行,\Tab
awk的内置常量
在awk中有很多的系统变量,这些系统变量在我们编写awk脚本的时候会经常使用到,我现在将经常使用到的系统变量列举出来,并做简要说明。
$0 | 当前记录内容 | awk '{print $0}' |
$1~$n | 分别保存着当前记录的字段1到字段n的内容 | awk '{print $1, $2, $3}' |
FS | 字段的分隔符,默认是空格或Tab | awk '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