2013-07-09 38 views
3

日誌文件包含許多Python回溯。我只關心由於KevinCustomError而產生的回溯。文件中可能有多個這類錯誤。如何使用awk或grep在日誌文件中捕獲整個Python追蹤?

如何使用grep,另一個流行的unix命令或其組合來轉儲整個回溯特定錯誤?

下面是一個示例日誌文件。我想從這個文件中的第1-3行。在真正的日誌文件中,回溯要長得多。

Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
KevinCustomError: integer division or modulo by zero 
Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
ZeroDivisionError: integer division or modulo by zero 
+0

我建議代替'awk'。它在處理這類事情方面效果更好,因爲當您處理數據時,可以跨多行存儲狀態(使用變量)。 – DaoWen

+0

我認爲實際的回溯不僅僅是3行,對吧?如在,他們是可變長度。 – voithos

+0

voithos,這是正確的 –

回答

0

這是AWK腳本,我試着把它們放在一起。

awk '{a[NR]=$0}; /KevinCustomError/ {for(i=0; a[NR-i] !~ /Traceback/; i++) {} i++; while(i-- >= 0) {print a[NR-i]}}' logfile 

或以文件形式。

{a[NR] = $0}; 

{ 
    if ($0 ~ /KevinCustomError/) 
    { 
     for (i = 0; a[NR-i] !~ /Traceback/; i++) 
     {} 
     i++ 
     while (i-- >= 0) 
     { 
      print a[NR-i]; 
     } 
    } 
} 

使用喜歡:awk -f logscript.awk logfile

不太熟悉AWK,所以任何批評都是值得歡迎的。基本上,它會跟蹤到目前爲止所讀取的所有行,然後向後搜索以找到「Traceback」標記(如果您願意,可以將其替換),然後在所有行之間打​​印(按正確順序)。

0

我以前用過類似的問題來解決類似的問題。作爲獎勵,如果你有多次出現的KevinCustomError,它會爲每一個提取回溯。當與回溯測試數據上運行

#!/bin/bash 

INPUT=$1 
TOP='Traceback' 
BOTTOM='KevinCustomError' 

grep -n "$BOTTOM" $INPUT | while read match 
do 
    # This gets just the line number from the grep command 
    END=${match%%:*} 
    # Gets just the part of the file before END, flips it, 
    # then gets the line number for TOP 
    TEMP=`head -n $END $INPUT | tac | grep -n $TOP` 
    # TEMP is really the number of lines from END to Traceback 
    START=`expr $END - ${TEMP%%:*} + 1` 
    echo $START $END 
    sed -n "$START, $END p" < $INPUT 
done 

輸出翻轉(因爲它是更有趣的):

4 6 
Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
KevinCustomError: integer division or modulo by zero 
0

這裏是另一種方式與awk

awk ' 
/^KevinCustomError/ { for(;x<length(arry);) print arry[++x]; print $0 } 
/^Traceback/  { delete arry; i=x=0 } 
        { arry[++i]=$0 } 
' logFile