2つのパターン間で複数のグループを検索してキャプチャする

ビル

ORA-01555で始まる行とそれに関連するSQLステートメントのアラートログの内容をキャプチャする必要があります。

ファイルの内容は以下のとおりです。

Sat Oct 21 12:11:40 2017
Thread 1 advanced to log sequence 143 (LGWR switch)
  Current log# 5 seq# 143 mem# 0:
Sat Oct 21 12:12:22 2017
Thread 1 cannot allocate new log, sequence 144
Private strand flush not complete
  Current log# 5 seq# 143 mem# 0:
Sat Oct 21 12:12:22 2017
ORA-01555 caused by SQL statement below (SQL ID: 1sfgms7z66zrs, SCN: 0x0401.1e45bbc4):
Sat Oct 21 12:11:48 2017
CREATE INDEX AAD_SAA_ADB_RESULTS_AUD_GTI1 ON AAD_PS_SAA_ADB_RESULTS_AUD_GT (
 rpt_date
)
Sat Oct 21 12:20:56 2017
Thread 1 advanced to log sequence 153 (LGWR switch)
  Current log# 6 seq# 153 mem# 0: 
+REDO_VOL1/DSS1STG/ONLINELOG/group_6.262.957710915
  Current log# 6 seq# 153 mem# 1: 
+REDO_VOL1/DSS1STG/ONLINELOG/group_6.263.957710917
Sat Oct 21 12:21:11 2017
ORA-01555 caused by SQL statement below (SQL ID: 9ad5awvfvsfd9, Query 
Duration=6444 sec, SCN: 0x0401.1e53de65):
Sat Oct 21 12:21:11 2017
SELECT a.EMPLID,    a.TEST_ID,    a.TEST_COMPONENT,    a.SCORE
    FROM
    ODS_PSE.PS_STDNT_TEST_COMP a,
    DSS_RDS.IR_STU_TST_SCR_SAT_VLD_DT_ST b
    where
    a.TEST_COMPONENT in ('VE','MA')
    AND a.EMPLID = b.PRSN_UNIV_ID
    AND ROUND(a.SCORE) = a.SCORE
    AND a.TEST_ID = b.STU_TST_CD
    AND a.TEST_DT = b.TEST_DT
    AND a.LS_DATA_SOURCE = b.LS_DATA_SOURCE
UNION
    SELECT a.EMPLID,    a.TEST_ID,    a.TEST_COMPONENT,    a.SCORE
    FROM
    ODS_PSE.PS_STDNT_TEST_COMP a,
    DSS_RDS.IR_STU_TST_SCR_SAT_VLD_DT_ST b
    where
    a.TEST_COMPONENT in ('ERWS','MSS','MT','RT','WLT') 
    AND a.EMPLID = b.PRSN_UNIV_ID
    AND ( 
            (ROUND(a.SCORE) = a.SCORE and a.TEST_COMPONENT in 
('ERWS','MSS','RT','WLT'))
        or  (a.SCORE BETWEEN 10 AND 40  and a.TEST_COMPONENT in ('MT'))
        )
    AND a.TEST_ID = b.STU_TST_CD
    AND a.TEST_DT = b.TEST_DT
    AND a.LS_DATA_SOURCE = b.LS_DATA_SOURCE
Sat Oct 21 13:05:01 2017
Thread 1 advanced to log sequence 173 (LGWR switch)
  Current log# 5 seq# 173 mem# 0:     +REDO_VOL1/DSS1STG/ONLINELOG/group_5.257.957710909
  Current log# 5 seq# 173 mem# 1:     +REDO_VOL1/DSS1STG/ONLINELOG/group_5.256.957710911

キャプチャしたいコンテンツは次のとおりです。

ORA-01555 caused by SQL statement below (SQL ID: 1sfgms7z66zrs, SCN: 0x0401.1e45bbc4):
Sat Oct 21 12:11:48 2017
CREATE INDEX AAD_SAA_ADB_RESULTS_AUD_GTI1 ON AAD_PS_SAA_ADB_RESULTS_AUD_GT (
 rpt_date
)
ORA-01555 caused by SQL statement below (SQL ID: 9ad5awvfvsfd9, Query 
Duration=6444 sec, SCN: 0x0401.1e53de65):
Sat Oct 21 12:21:11 2017
SELECT a.EMPLID,    a.TEST_ID,    a.TEST_COMPONENT,    a.SCORE
    FROM
    ODS_PSE.PS_STDNT_TEST_COMP a,
    DSS_RDS.IR_STU_TST_SCR_SAT_VLD_DT_ST b
    where
    a.TEST_COMPONENT in ('VE','MA')
    AND a.EMPLID = b.PRSN_UNIV_ID
    AND ROUND(a.SCORE) = a.SCORE
    AND a.TEST_ID = b.STU_TST_CD
    AND a.TEST_DT = b.TEST_DT
    AND a.LS_DATA_SOURCE = b.LS_DATA_SOURCE
UNION
    SELECT a.EMPLID,    a.TEST_ID,    a.TEST_COMPONENT,    a.SCORE
    FROM
    ODS_PSE.PS_STDNT_TEST_COMP a,
    DSS_RDS.IR_STU_TST_SCR_SAT_VLD_DT_ST b
    where
    a.TEST_COMPONENT in ('ERWS','MSS','MT','RT','WLT') 
    AND a.EMPLID = b.PRSN_UNIV_ID
    AND ( 
            (ROUND(a.SCORE) = a.SCORE and a.TEST_COMPONENT in 
('ERWS','MSS','RT','WLT'))
        or  (a.SCORE BETWEEN 10 AND 40  and a.TEST_COMPONENT in ('MT'))
        )
    AND a.TEST_ID = b.STU_TST_CD
    AND a.TEST_DT = b.TEST_DT
    AND a.LS_DATA_SOURCE = b.LS_DATA_SOURCE

これが私が使用しているgrepですが、結果からわかるように、ORA-01555の各行とそのSQLステートメント全体のコンテンツをキャプチャしていません。私のネガティブな先読みがうまく機能していない理由がわかりません:

grep -Pzo 'ORA-01555.*\n(^.*[0-9]{2}:[0-9]{2}:[0-9]{2}.*)\n.*(?!.*[0-9]{2}:[0-9]{2}.*\n).+' alert.log

ORA-01555 caused by SQL statement below (SQL ID: 1sfgms7z66zrs, SCN: 0x0401.1e45bbc4):
Sat Oct 21 12:11:48 2017
CREATE INDEX AAD_SAA_ADB_RESULTS_AUD_GTI1 ON AAD_PS_SAA_ADB_RESULTS_AUD_GT (
ORA-01555 caused by SQL statement below (SQL ID: 9ad5awvfvsfd9, Query Duration=6444 sec, SCN: 0x0401.1e53de65):
Sat Oct 21 12:21:11 2017
SELECT a.EMPLID,    a.TEST_ID,    a.TEST_COMPONENT,    a.SCORE
ctac_

このsedコマンドを試すことができます。

sed -E '/ORA-01555/!d;:A;N;/\n[A-Za-z]{3} [A-Za-z]{3} [0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} [0-9]{4}$/!bA;:B;N;/\n[A-Za-z]{3} [A-Za-z]{3} [0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} [0-9]{4}$/!bB;s/(.*)\n.*/\1/' infile

行にORA-01555が含まれている場合->パターンスペースに保持します。

日付ではないのに、パターンスペースで次の行を取ります。

パターンスペースに最初のデートを保管してください。

日付ではない間、次の行を続けてください。

日付であるパターンスペースの最後の行を削除します。

パターンスペースを印刷し、最初に戻って、ORA-01555の新しい行を見つけます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

2つのパターン間で複数のグループを検索してキャプチャする

分類Dev

パターンを定義し、それを再利用して複数のグループをキャプチャすることは可能ですか?

分類Dev

grep:ダブルキャプチャで複数行のパターンを検出する

分類Dev

1つのグループで複数のサブストリングをキャプチャする

分類Dev

複雑なgolang regexpキャプチャで複数のグループをキャプチャする方法

分類Dev

キャプチャグループなしでマーカーを除外して2つのマーカー間の文字列を解析する正規表現

分類Dev

正規表現を使用して複数のパターンをキャプチャする方法は?

分類Dev

正規表現はパターンを再利用して複数のグループをキャプチャしますか?

分類Dev

他の 2 つの単語の間に存在する場合、グループをキャプチャします

分類Dev

1行で複数のグループをキャプチャする方法

分類Dev

2つの正規表現キャプチャグループを使用して2つのパンダ列を作成する方法

分類Dev

単一のパターンを使用して、luaスクリプトのファイルに含まれる複数の値をキャプチャする

分類Dev

パイプ演算子を使用して、2つのPythonスクリプト間でデータの複数のバッチをストリーミングする

分類Dev

複数のセットをキャプチャするJavaregパターン

分類Dev

プログラムでホーム画面のカスタムランチャーの検索バーとしてグーグルを設定する

分類Dev

最初ではなく目的のキャプチャグループの前の最後のパターンを使用して正規表現で選択する

分類Dev

パンダは、複数の正規表現キャプチャグループを介して複数の列を作成します

分類Dev

正規表現を使用して「複数」の繰り返しグループをキャプチャする方法

分類Dev

2つの特別なキャラクターのグループ間のすべてをキャプチャしますが、キャラクターが本文に1回表示されるようにします

分類Dev

繰り返しパターンですべてのグループの最初の出現をキャプチャする正規表現

分類Dev

RegExpを使用して複数のキャプチャグループを再帰的に取得する

分類Dev

正規表現:すべての文字列に一致しますが、2つのシンボル間のグループをキャプチャします

分類Dev

Javaの正規表現を使用して複数行のパターンをキャプチャするにはどうすればよいですか?

分類Dev

テーブルタグ内のクラスをキャプチャし、複数のアイテムをキャプチャする

分類Dev

複数の URL パラメータ/セグメントをキャプチャするには?

分類Dev

複数の発生を正規表現でキャプチャし、グループに配置する

分類Dev

RegExを使用して、キャプチャされた2つのグループを比較できます

分類Dev

正規表現を使用して2つの見出しの間のテキストを抽出する方法には、複雑な非キャプチャグループが必要です

分類Dev

正規表現:繰り返しキャプチャグループのすべての個別インスタンスをキャプチャする

Related 関連記事

  1. 1

    2つのパターン間で複数のグループを検索してキャプチャする

  2. 2

    パターンを定義し、それを再利用して複数のグループをキャプチャすることは可能ですか?

  3. 3

    grep:ダブルキャプチャで複数行のパターンを検出する

  4. 4

    1つのグループで複数のサブストリングをキャプチャする

  5. 5

    複雑なgolang regexpキャプチャで複数のグループをキャプチャする方法

  6. 6

    キャプチャグループなしでマーカーを除外して2つのマーカー間の文字列を解析する正規表現

  7. 7

    正規表現を使用して複数のパターンをキャプチャする方法は?

  8. 8

    正規表現はパターンを再利用して複数のグループをキャプチャしますか?

  9. 9

    他の 2 つの単語の間に存在する場合、グループをキャプチャします

  10. 10

    1行で複数のグループをキャプチャする方法

  11. 11

    2つの正規表現キャプチャグループを使用して2つのパンダ列を作成する方法

  12. 12

    単一のパターンを使用して、luaスクリプトのファイルに含まれる複数の値をキャプチャする

  13. 13

    パイプ演算子を使用して、2つのPythonスクリプト間でデータの複数のバッチをストリーミングする

  14. 14

    複数のセットをキャプチャするJavaregパターン

  15. 15

    プログラムでホーム画面のカスタムランチャーの検索バーとしてグーグルを設定する

  16. 16

    最初ではなく目的のキャプチャグループの前の最後のパターンを使用して正規表現で選択する

  17. 17

    パンダは、複数の正規表現キャプチャグループを介して複数の列を作成します

  18. 18

    正規表現を使用して「複数」の繰り返しグループをキャプチャする方法

  19. 19

    2つの特別なキャラクターのグループ間のすべてをキャプチャしますが、キャラクターが本文に1回表示されるようにします

  20. 20

    繰り返しパターンですべてのグループの最初の出現をキャプチャする正規表現

  21. 21

    RegExpを使用して複数のキャプチャグループを再帰的に取得する

  22. 22

    正規表現:すべての文字列に一致しますが、2つのシンボル間のグループをキャプチャします

  23. 23

    Javaの正規表現を使用して複数行のパターンをキャプチャするにはどうすればよいですか?

  24. 24

    テーブルタグ内のクラスをキャプチャし、複数のアイテムをキャプチャする

  25. 25

    複数の URL パラメータ/セグメントをキャプチャするには?

  26. 26

    複数の発生を正規表現でキャプチャし、グループに配置する

  27. 27

    RegExを使用して、キャプチャされた2つのグループを比較できます

  28. 28

    正規表現を使用して2つの見出しの間のテキストを抽出する方法には、複雑な非キャプチャグループが必要です

  29. 29

    正規表現:繰り返しキャプチャグループのすべての個別インスタンスをキャプチャする

ホットタグ

アーカイブ