
我正在編寫一個 shell 腳本程式來從日誌檔案中提取一些異常並進行一些處理。目前,我在腳本中使用以下命令來捕獲日誌檔案中出現異常的行號。例外行將包含ERROR
日期和時間戳之後的關鍵字
lineNos=($(grep -n ERROR $file | grep Exception | cut -d':' -f1 | tail -3))
在測試當前腳本時,我注意到某些日誌條目在同一行中包含錯誤和異常,但這實際上不是我正在尋找的錯誤類型(示例第 5 行)我想以這種方式修改我的腳本它只會傳回下面範例日誌中的第3 行。
2016-10-21 15:25:37,231 INFO Processinng current row
2016-10-21 15:25:37,231 INFO com.test.main com.test.controller.CrashException:
2016-10-21 15:25:37,231 ERROR com.test.main com.test.controller.CrashException:
2016-10-21 15:25:37,231 DEBUG com.test.main com.test.controller.CrashException:
2016-10-21 15:25:37,231 DEBUG Processing row with ERROR and Exception
2016-10-21 15:25:37,231 DEBUG processed row 1:
答案1
如果您想取得包含單字ERROR
和 的行Exception
,請嘗試:
grep -E "ERROR.*Exception" $file
答案2
如果您使用awk
代替grep
,您不僅可以列印行號(更準確地說,記錄數字)直接,但也單獨測試特定的空白分隔字段,例如
awk '$3 == "ERROR" && /Exception/ {print NR}' logfile
或(更具體地說 - 將比賽限制Exception
在最後一場)
awk '$3 == "ERROR" && $NF ~ /Exception/ {print NR}' logfile
答案3
cat thelogfile.log | nl -ba | grep "ERROR"
這會將檔案透過管道傳輸到 nl 到編號行,然後使用 grep 過濾錯誤行。如果您只想要錯誤行號,請新增 awk '{print $1}'。 cat 也可以使用 -n 標誌來行號,但我更喜歡 nl。
有錯誤的行號數組變數的範例;
linenos=($(cat -n thelogfile.log | grep "ERROR" | awk '{print $1}' | tr "\n" " " | sed 's/$/\n/'))
編輯:
ps grep 即可;
grep ",[0-9]* ERROR"
答案4
使用更具體的正規表示式:
grep '^[0-9, :-]\+ERROR' "$file"