2017-10-22 7 views
1

ORA-01555로 시작하는 행 및 관련 SQL 문에 대한 경고 로그의 내용을 캡처해야합니다.두 패턴 사이에서 여러 그룹 검색 및 캡처

파일의 내용은 다음과 같습니다 : 여기

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을하지만, 당신이 결과에서 볼 수 있듯이이 외설 :

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 

I 캡처 할 내용은 각 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 -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 공간에 보관하십시오.

날짜가없는 동안에도 다음 줄을 계속 사용하십시오.

patern 공간의 마지막 행을 삭제합니다.

ORA-01555를 사용하여 patern 공간을 인쇄하고 시작으로 돌아가 새로운 줄을 찾습니다.

+0

그것을 베어! 고마워. –

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을 사용하고 있습니다. –