2015-02-02 7 views
0

저는 sophos 프록시에서 액세스 로그를 처리하기 위해 돼지 스크립트를 작성하고 있습니다.PIG에 큰 따옴표가있는 Regex

각 라인 같다 :

2015 : 01 : 13-00 : 00 : 01-AR-BADC FAST-01에서 httpProxy [27,983] : ID = "0001"심각도 = "정보"= SYS "SecureWeb"sub = "http"name = "http access"action = "pass"method = "GET"srcip = "10.20.7.210"dstip = "10.24.2.7"user = ""ad_domain = ""statuscode = "302 "size ="0 "request ="0x9ac68d0 "url ="http://www.google.com "="0 "profile ="0 "profile ="REF_DefaultHTTPProfile (기본 웹 필터 프로필) "filteraction ="REF_DefaultHTTPCFFAction (기본 컨텐츠 필터 동작) "=" "=" "==" "==" "="0 "=="0 "=="== "authtime ="0 "avscantime ="0 "fullreqtime ="예외 = ""avr, auth, content, url, ssl, certcheck, "239428"device = "0"auth = "0"

그래서 MapReduce를 사용하여 Java에서 다음 정규 표현식을 사용하여 처리했습니다. \"([^\"]*)\" 따옴표 사이의 값을 가져온 다음 처리합니다. 이제 돼지와 똑같이하고 싶지만 각 줄에 정규식을 적용 할 수는 없습니다.

input = load './http.log' as (line : chararray); 
splt = foreach input generate FLATTEN(REGEX_EXTRACT_ALL(line,'(\\"([^\\"]*)\\")')); 
dump splt; 

을 그리고 덤프의 결과는 다음과 같습니다 :

내가하고있어().

내가 REGEX_EXTRACT_ALL을 (를) 사용하지 않았거나 다른 방식으로 정규 표현식의 일부 문자를 이스케이프 처리해야하는 것이 있습니까?

감사합니다.

+0

따옴표는 정규 표현식에 특별한 아무것도 스크립트의 나머지 부분을 계속 수를 인용 할 필요가 없습니다; 문자열 리터럴에서 인용 부호를 사용해야하기 때문에 Java에서만 그렇게해야합니다. 그러나 PIG에는 필요하지 않으므로 백 슬래시를 제거하십시오. – fge

+0

@fge 다음과 같이 따옴표 사이의 모든 값을 가져 오려면이 방법으로 정규 표현식 ('\ "([^ \"] *) \ "을 사용해야합니다. https://www.regex101.com/r/yF8xN8/1. 그러나 돼지가 나타나지 않으면, 돼지 스크립트를 실행할 때''예상치 못한 문자 '' ''가 나타납니다. – Rumal

답변

0

필자는 다른 방법으로 값을 추출 할 수있었습니다. 왜냐하면 필자는이 필드의 일부 필드를 원했기 때문입니다. 내가 뭘 값을 얻기 위하여

:

splt = FOREACH A GENERATE 
    FLATTEN(REGEX_EXTRACT(line,'.*url="([^"]*)".*',1)) AS url, 
    FLATTEN(REGEX_EXTRACT(line,'.*fullreqtime="([^"]*)".*',1)) AS duration, 
    FLATTEN(REGEX_EXTRACT(line,'.*size="([^"]*)".*',1)) AS bytes; 

을 그리고 내가