Шаблон Grok для извлечения сложной структуры строк?

У меня есть одна строка, например

sgcib.solstis.core.dao.referential.InsertionMonitoringDao:10:37:36.860 [SOLSTAIRJVM1: customService :false-persistor-3-] INFO Begin updating insertion_monitoring table: analysisProcessId=1000000648897, insertionMonitorId=9153700, binFileName=TIS_MRM_Meteor_DeltaSpot_RA_SMCPLX_47769.2x2.2016-11-29-00-00-00_1480377600000.bin.tisdevweb043.SOLSTAIRJVM1

Здесь извлеките значение [SOLSTAIRJVM1: customService :false-persistor-3-] как поле потока И 1000000648897 как одно поле analysisProcessId и 9153700 как другое поле insertionMonitorId. Значения полей в строке ввода необязательны, если поля, не найденные в строке ввода, должны отображаться с пустым значением.

Может ли кто-нибудь предложить, как написать шаблон?


person Nagappa L M    schedule 22.12.2016    source источник
comment
Может \[(?<thread>[^\]\[]*)].*?analysisProcessId=(?<analysisProcessId>\d+).*?insertionMonitorId=(?<insertionMonitorId>\d+)?   -  person Wiktor Stribiżew    schedule 22.12.2016
comment
Спасибо, позвольте мне проверить URL-адрес grokdebug.herokuapp.com. Нет, не повезло   -  person Nagappa L M    schedule 22.12.2016
comment
Пожалуйста, можете предложить использовать указанный выше URL. Я пытаюсь   -  person Nagappa L M    schedule 22.12.2016
comment
Приведенное выше регулярное выражение было протестировано по ссылке перед публикацией. SO добавляет в комментарии мусорные символы. См. regex101.com/r/UNk06w/2, скопируйте шаблон из скрипта regex101.   -  person Wiktor Stribiżew    schedule 22.12.2016
comment
Большое спасибо У меня есть решение   -  person Nagappa L M    schedule 22.12.2016


Ответы (1)


Вы можете использовать

\[(?<thread>[^\]\[]*)].*?analysisProcessId=(?<analysisProcessId>\d+).*?insertionMonitorId=(?<insertionMonitorId>\d+)

Описание:

  • \[ - буквальное [
  • (?<thread>[^\]\[]*) -
  • ].*? - литерал ], за которым следуют любые символы 0+, кроме символов разрыва строки, как можно меньше до первого
  • analysisProcessId= - подстрока analysisProcessId=
  • (?<analysisProcessId>\d+) - Группа "analysisProcessId", захватывающая 1+ цифры
  • .*?insertionMonitorId= - любые символы 0+, кроме символов разрыва строки, как можно меньше до включительно. первый insertionMonitorId=
  • `(?\d+) - Группа "insertionMonitorId", захватывающая 1+ цифры

См. демонстрационный экран:

введите здесь описание изображения

person Wiktor Stribiżew    schedule 22.12.2016
comment
Не могли бы вы предложить вместе с извлечением полей. Как взять исходную точную строку в качестве другого поля? - person Nagappa L M; 22.12.2016
comment
Вы имеете в виду, что вся строка должна быть полем сама по себе? Что-то вроде ^(?<whole>.*?\[(?<thread>[^\]\[]*)].*?analysisProcessId=(?<analysisProcessId>\d+).*?insertionMonitorId=(?<insertionMonitorId>\d+).*). - person Wiktor Stribiżew; 22.12.2016
comment
Большое тебе спасибо - person Nagappa L M; 22.12.2016
comment
Например, для данного ввода любая строка [любая строка1] IN, если шаблон .*?(?‹thread_name›[.*]) здесь значение поля thread_name равно anystring1. Я хочу, чтобы если [anystring1] не существовало, значение thread_name было равно .what будет новый образец? - person Nagappa L M; 23.12.2016
comment
Привет, привет, вы вернулись, спасибо, [anystring1] не извлекается как значение поля с использованием (?‹thread_name›(?:[.*])?). Извините, я использовал (?‹thread_name›[.*]) не .*? (?‹thread_name›[.*]) - person Nagappa L M; 23.12.2016
comment
Всегда ли [anystring1] стоит в конце строки? Если да, (?<thread_name>(?:\[.*\])?)$ должно работать. - person Wiktor Stribiżew; 23.12.2016
comment
Спасибо. [anystring1] не всегда может быть в конце строки. - person Nagappa L M; 23.12.2016
comment
Хорошо, тогда используйте (?:(?!\[[^\]\[]*\]).)*(?<thread_name>(?:\[[^\]\[]*\])?) - person Wiktor Stribiżew; 23.12.2016
comment
О, большое спасибо. Это работает. Похоже, вы добавили много изменений. Мне становится трудно анализировать. Точно так же, как сделать все значения полей пустыми, если шаблон не существует в строке ввода для приведенного ниже .*?(?‹thread_name›[.*]).*?(analysisProcessId=)*(?‹analysisprocessId›\d*) .*?insertionMonitorId=(?‹insertionmonitorId›\d*).*?binFileName=*(?‹binfilename›.*.bin*) Пожалуйста, помогите мне, я проанализирую позже, чтобы лучше понять - person Nagappa L M; 23.12.2016
comment
Кстати, я использовал строку ввода sgcib.solstis.core.dao.referential.InsertionMonitoringDao:10:37:36.860 [SOLSTAIRJVM1: customService :false-persistor-3-] INFO Начните обновление таблицы insertion_monitoring: analysisProcessId=1000000648897, insertionMonitorId=9153700 , binFileName=TIS_MRM_Meteor_DeltaSpot_RA_SMCPLX_47769.2x2.2016-11-29-00-00-00_1480377600000.bin.tisdevweb043.SOLSTAIRJVM1 - person Nagappa L M; 23.12.2016
comment
Вы сможете сделать это самостоятельно, изучив умеренный жадный токен. Замените все .*? на соответствующий TGT. - person Wiktor Stribiżew; 23.12.2016
comment
Спасибо за мотивацию - person Nagappa L M; 23.12.2016
comment
Эй, извините за повторение, я мог видеть [anystring1] как значение поля, но мне нужно anystring1 как значение, как избежать [ и ] в значении? - person Nagappa L M; 23.12.2016
comment
Поместите [ и ] вне группы захвата. \[(?<group>[^\]\[]*)\]. Если это необязательно, оберните (\[(?<group>[^\]\[]*)\])? - person Wiktor Stribiżew; 23.12.2016
comment
Привет, не могли бы вы помочь мне с stackoverflow.com/questions/41426198/ Не понимаю, как взять шаблон, который заканчивается на , - person Nagappa L M; 03.01.2017