2015-02-02 7 views
0

Я пишу скрипт свиньи для обработки журнала доступа из прокси-сервера sophos.Regex с двойными кавычками в PIG

Каждая строка, как:

2015: 01: 13-00: 00: 01 АР-BADC-FAST-01 httpproxy [27983]: 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 "cached =" 0 "profile =" REF_DefaultHTTPProfile (профиль веб-фильтра по умолчанию) "filteraction =" REF_DefaultHTTPCFFAction (действие фильтра содержимого по умолчанию) "size =" 0 "request =" 0x9ac68d0 "url =" http://www.google.com "exceptions =" ​​av, auth, content, url, ssl, certcheck, certdate, mime, cache, fileextension "error =" "authtime =" 0 "dnstime =" 1 "cattime =" 0 "avscantime =" 0 "fullreqtime = "239428" device = "0" auth = "0"

Так что мне удалось сделать это на Java с помощью MapReduce, используя следующее регулярное выражение: \"([^\"]*)\", чтобы получить значения между кавычками и затем обработать их. Теперь я хочу сделать то же самое с свиньей, но я не могу применить регулярное выражение к каждой из строк.

Я делаю:

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. Но если я не scape \, я получаю: 'Неожиданный символ '' '' при выполнении скрипта свиньи – 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; 

И тогда я могу продолжить с остальной частью сценария

Смежные вопросы