2013-08-01 2 views
2

데이터로드시 발생한 오류를 보여주는 거대한 오류 로그 파일이 있습니다.grep/sed/awk를 사용하여 유닉스에서 파일을 필터링하고 있습니까?

나는 독특한 구속 위반되지 않는 오류를보고 할 필요가 있지만, 파일을 통해 검색을 수동으로 크기 때문에 비현실적이다.

로그 파일 :

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) 

원하는 출력 파일이 나는이가 나오지이나 AWK, 그렙에서 수행 할 수 있습니다 확신 해요,하지만 난 이런 종류의 새로운이야

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) 

입니다 나는 포인터 또는 2 점을 정말 고맙게 생각합니다. 를 사용

답변

2

가있다 ORA-00001을 제외하고 Perl-regex (부정적인 lookahead 포함)를 사용하여 일치하는 ORA (-B1) 앞에 줄을 얻을 수있는 가능한 해결책 :

grep -B1 -P 'ORA\-(?!00001)' logfile 
+0

절대적으로 완벽한! 너와 모두 덕분에! – Nimbocrux

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) 
2

사용 grep을. 이제 입력에서이 라인을 제거

grep -B1 "unique constraint.*violated" filename 

: : 당신은 할에 의해 생산 될 줄 싶어

grep -v -f <(grep -B1 "unique constraint.*violated" filename) filename 

을 당신은 결과를 얻을 :

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 

는 (이 는 것을 가정 Record ...ORA-...은 다른 행에 있습니다. ! 그 같은 줄에있는 경우, grep -v "unique constraint.*violated" filename

2

) 일 것입니다 당신이 사용할 수 perl이있는 경우는 단락 모드를 사용할 수 있습니다 awk를 사용

$ perl -00 -ne 'print unless /unique constraint/m;' < foo.input 
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) 

같은 :

여기
$ awk -v RS= '!/unique constraint/' foo.input 
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) 
2

당신 (GNU이 나오지도)에 대한이 작동하지 않을 수 있습니다 : 각 레코드

sed '/^Record/{N;N;/\nORA-00001:/d}' logfile 

읽기 3 라인과 그 라인이 포함되어있는 경우 원치 않는 코드를 삭제합니다. 더 많은 필터링이 필요하다면

, 상기 코드는 클로징 } 전에 첨가 할 수있다.

관련 문제