2

データロードで発生したエラーを示す巨大なエラー ログ ファイルがあります。

一意の制約違反ではないエラーを報告する必要がありますが、ファイルを手動で検索することは、そのサイズのために実際的ではありません。

ログファイル:

Record 1: Rejected - Error on table DMT_.
ORA-00001: unique constraint (DM.DMT__PK) violated

Record 2: Rejected - Error on table DMT_.
ORA-01400:cannot insert NULL in to("DM"."DMT_INSURANCE"."INSURANCE_FUND_CODE")

Record 3: Rejected - Error on table DMT_.
ORA-00001: unique constraint (DM.DMT__PK) violated

Record 4: Rejected - Error on table DMT_ADDRESS, column ORIGINAL_POSTCODE.
ORA-12899: value too large for column "DM"."DMT_ADDRESS"."ORIGINAL_POSTCODE" (actual: 12, maximum: 10)

目的の出力ファイルは

Record 2: Rejected - Error on table DMT_.
ORA-01400:cannot insert NULL in to("DM"."DMT_INSURANCE"."INSURANCE_FUND_CODE")

Record 4: Rejected - Error on table DMT_ADDRESS, column ORIGINAL_POSTCODE.
ORA-12899: value too large for column "DM"."DMT_ADDRESS"."ORIGINAL_POSTCODE" (actual: 12, maximum: 10)

これはgrep、sed、またはawkで実行できると確信していますが、この種のことは初めてです...ポインタを1つか2ついただければ幸いです。

4

5 に答える 5

2

Perl-regex (負の先読み) を使用して ORA-00001 を除外し、一致する ORA の前の行も取得する (-B1) 場合の解決策を次に示します。

grep -B1 -P 'ORA\-(?!00001)' logfile
于 2013-08-01T06:24:42.297 に答える
1

を使用する一方向。で始まるすべてのフィールドについて、Record次のフィールドを読み取り、文字列との一致を試みますunique ...。うまくいかない場合は、改行を追加して両方を印刷します。

sed -n '/^Record/ { N; /unique constraint .* violated/! { s/$/\n/; p } }' infile

次の結果が得られます。

Record 2: Rejected - Error on table DMT_.
ORA-01400:cannot insert NULL in to("DM"."DMT_INSURANCE"."INSURANCE_FUND_CODE")

Record 4: Rejected - Error on table DMT_ADDRESS, column ORIGINAL_POSTCODE.
ORA-12899: value too large for column "DM"."DMT_ADDRESS"."ORIGINAL_POSTCODE" (actual: 12, maximum: 10)
于 2013-08-01T06:10:47.797 に答える