目標:
查看日誌文件中,所有空指針異常發生的位置,及前後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