当前位置:首页 » Linux技术知识

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

2018-04-21 12:02 本站整理 浏览(0)

目标:

查看日志文件中,所有空指针异常发生的位置,及前后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