2014-10-15 4 views
1

자바 정규식 및 캡처 그룹과 관련하여 질문이 있습니다. 내 목표는 로그 파일을 구문 분석하고 관련 필드를 QRadar에 추출하는 것입니다. QRadar는 Java 정규 표현식을 사용하여 로그 파일을 분석하고 내 질문은 정규 표현식 문제이므로 자바 코드를 작성하는 것이 아닙니다. 문제를 해결하기 위해 여기에 게시하고 싶습니다. 나는 CEF (공통 이벤트 형식) 형식의 로그 파일 인 로그 파일을 구문 분석하려고정규 표현식 및 캡처 그룹

-

여기 내 질문에갑니다. 로그 파일에서 라인의 몇 다음 -

[blah, blah...] cs1=DataValue1 cs2=DataValue2 

[blah, blah...] cs2=DataValue3 cs1=DataValue4 

내 목표하면 필드 위의 라인에서 cs1cs2에 대한 데이터 값을 추출하는 것입니다. \scs1\=(.*?)\s\w+\=

- CS1 필드

정규식 - 나는 그것들을 달성하기위한 다음과 같은 정규 표현식을 함께했다 DataValue1, 위의 라인

에서 DataValue2, DataValue3DataValue4 - 그래서 값을 캡처에 관심

RegEx for cs2 field - \scs2\=(.*?)\s\w+\=

위의 정규식과 캡처 그룹을 사용하여 데이터 값을 캡처 할 수 있습니다. 그러나 어떤 경우에만 가능합니다. 따라서 위의 로그 항목을 보면 로그 항목 내의 cs1cs2 필드의 순서가 고정되어 있지 않음을 알 수 있습니다. 따라서 cs1 필드는 cs2 (로그 입력 도중에) 앞에 나타나고 다른 경우에는 cs1 필드가 로그 항목의 마지막 필드 (마지막 필드)에 나타납니다. cs2 필드에서도 비슷한 동작이 발생합니다. 현재 정규 표현식을 사용하면 필드가 마지막 필드가 아닐 때만 작동합니다.

예. 첫 번째 로그 엔트리 라인 [blah, blah...] cs1=DataValue1 cs2=DataValue2의 경우 정규 표현식은 cs1 필드의 값을 올바르게 구문 분석/추출하지만 cs2 필드가 라인의 끝에 있기 때문에 cs2 필드에 대해 실패합니다.

마찬가지로, 2 차 로그 항목 라인 [blah, blah...] cs2=DataValue3 cs1=DataValue4, 내 정규 표현식이 올바르게/구문 분석 cs2 필드의 값을 추출하지만 그들은 cs1 필드가 줄의 끝 부분에 있기 때문에 cs1 필드의 값을 추출하는 데 실패합니다.

내 질문입니다 - 로그 파일 항목 중간 또는 끝에 나타나는지 여부에 관계없이 데이터 필드 값을 올바르게 구문 분석/추출 할 수 있도록 내 정규식이 있어야합니까? 경우 사람이 나뿐만 아니라 (https://www.ibm.com/developerworks/community/forums/html/topic?id=f48bc2dc-2ccb-42df-b543-dc0522491fad)를 QRadar 포럼에 질문을 게시 관심 만에 어떤 응답에 아직 운 ...

:

어떤 도움을

감사합니다,

PS를 감사

+0

의 값을 포함 CEF 파일의 : http://www.iwebdev.it/blog/?tag=common-event-format'. *?'를 모두 사용하지 말고 파일이 파싱 되길 기대하십시오 올바르게. – nhahtdh

답변

2

배열의 순서를 모르는 경우 미리보기를 사용하여 cs1cs2 필드의 값을 캡처하십시오.

^(?=.*?\scs1=(\S+))(?=.*\scs2=(\S+)) 

자바 정규식 것,

^(?=.*?\\scs1=(\\S+))(?=.*\\scs2=(\\S+)) 

DEMO

그룹 지수 1 cs1 및 인덱스 2의 값을 포함

이 사이트의 형식을 설명하는 것 cs2

+0

이것은 98 ~ 99 %의 경우에만 부분적으로 작동하는 솔루션이며 나머지 1 ~ 2 %는 실패합니다. – nhahtdh

+0

감사합니다 Avinash. 나는 그것이 나를 약간 도와 준다라고 생각한다. 그러나, 지금 당장 붙어있는 문제는 값이'space' 문자를 가질 수 있다는 것입니다. 따라서 합법적 인 값은 '데이터 값 1'이 될 수 있습니다. 현재 정규 표현식에서'\ S'는 기본적으로 공백 문자에서 멈추고 값의 일부만 캡처한다고 생각합니다. 귀하의 정규 표현식을 조정하여 그 사실을 설명하려고합니다. 행운은 아직 없습니다. 만약 당신이 '우주'문자를 고려하여 reg ex를 조정할 수 있습니다 여기에 업데이트 된 정규 표현식을 추가하십시오 ... –

+0

위의 것을 반영하는 샘플 문자열을 게시 할 수 있습니까? –