8

ログ ファイルには、多数の Python トレースバックが含まれています。が原因で発生したトレースバックのみを気にしKevinCustomErrorます。ファイルには、このクラスのエラーが複数存在する場合があります。

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
4

4 に答える 4

1

私が Python ログ ファイルの構造を正しく理解していれば、以下は小さなsed解決策です。

#!/usr/bin/sed -f
/^Traceback/{
:here
N
/\nKevinCustomError/b
s/.*\n\(Traceback\)/\1/
b here
}

要約Tracebackすると、スクリプトは;で始まる行に対してのみアクションを実行します。これらの行では、スクリプトは新しい行 ( N) を追加し続け、その後、新しく追加された行が で始まるかどうかを確認しKevinCustomErrorます。この場合、スクリプトは最後に分岐し、複数行のパターン スペースを出力します。そうでない場合、スクリプトは最後のTraceback-starting 行以外のすべてをパターン スペースから削除し、分岐して:here別の行 ( N) を追加します。

詳細には、次のように機能します。

  1. #!/usr/bin/sed -f: これはシェルにインタープリターとして使用し、オプションを介してファイル引数を渡すように指示するシェバン行です (これにより、代わりに実行できます);/usr/bin/sed-f./script filesed -f script file
  2. /^Traceback/で始まる行のみに一致しTracebackます。
  3. {…}ステップ 2 で一致した行に対してのみ実行されるコマンドをグループ化します。
    1. :hereはコマンドではなく、test またはbranch コマンドによって戻ることができる行をマークする単なるラベルです。
    2. N次のテキスト行を読み取って現在のパターン スペースに追加し、その間に改行\nを挿入します。これにより、パターン スペースが複数行になります。
    3. /\nKevinCustomError/b、パターン スペースの前に; が含まれている場合、これbはスクリプトの最後まで実行されます。KevinCustomError\n
      • これによりp、複数行パターン space がリントされます。これは、 で始まりTraceback、(少なくとも) aが含まれ、(最後の) ;の直後に\n含まれます。KevinCustomError\n
    4. s/.*\n\(Traceback\)/\1/(3. のパターンが一致しなかった場合はここにいます) パターン スペースの先頭部分を最後の まで削除し\nます。
    5. b hereに分岐し:here、この時点では印刷は行われません。
于 2020-01-30T23:24:11.103 に答える
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
于 2013-07-09T23:30:51.983 に答える
0

を使用した別の方法を次に示しますawk

awk '
/^KevinCustomError/ { for(;x<length(arry);) print arry[++x]; print $0 } 
/^Traceback/        { delete arry; i=x=0 }
                    { arry[++i]=$0 }
' logFile
于 2013-07-10T00:37:03.380 に答える