2017-10-22 13 views
1

ORA-01555で始まる行とその関連SQL文のアラート・ログの内容をキャプチャする必要があります。2つのパターン間で複数のグループを検索してキャプチャする

ファイルの内容は以下の通りです:

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のですが、あなたは結果に見ることができるようにそれがにISN各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 

答えて

2

あなたはこの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が含まれていれば、> patern領域に保管してください。

paternスペースの次の行は日付ではありません。

父親のスペースに最初の日付を入れてください。

次の行は日付ではありませんが、引き続き実行してください。

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

ORA-01555を使用して、paternスペースを印刷し、開始位置に戻って新しい行を探します。

+0

それを釘付け!ありがとうctac。 –

0

awkのソリューション:

awk '/ORA-01555/{ f=1 }f && /^[A-Z][a-z]{2} .* [0-9]{4}$/{ date++; if(date>=2) f=date=0 }f' alert.log 
+0

これは、ファイルの内容全体を返します。私が探しているものではない –

+0

@BillMyers、それについては疑問。このスクリーンショットhttps://ibb.co/i9HFy6はあなたの友だちです – RomanPerekhrest

+0

これは間違いなく私が友人を探しているのは間違いありませんが、私はファイル全体を取得しています。どのバージョンのawkを実行していますか?私はRHEL 6.9とGNU Awk 3.1.7です。 –