使用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章