Как извлечь только строки соответствия из многозначного поля и отобразить в новом столбце в запросе SPLUNK

Я пытаюсь извлечь совпавшие строки из многозначного поля и отобразить в другом столбце. Я пробовал различные варианты разделения поля по разделителю, а затем mvexpand, а затем пользователь where / search, чтобы вытащить эти данные. Я пытался найти более простой способ сделать это без всех этих хлопот в запросе SPLUNK.

Пример. Допустим, у меня ниже многозначное поле column1 с данными, разделенными запятой-разделителем.

column1 = abc1, test1, test2, abctest1, mail, send, mail2, sendtest2, new, code, results

Я разделял этот столбец с помощью разделителя |eval column2=split(column1,",") и использовал регулярное выражение / where / search для поиска данных с *test* в этом столбце и возврата результатов, где я смог получить результаты, но столбец 1 по-прежнему показывает все значения abc1,test1,test2,abctest1,mail,send,mail2,sendtest2,new,code,results , я хочу либо обрезать1 столбец1, чтобы отображались только слова, совпадающие с test, либо отображать те записи в новом столбце2, в котором должны отображаться только эти слова test1,test2,abctest1,sendtest2, поскольку они соответствуют только *test*.

Буду признателен за вашу помощь, спасибо.


person rockstar    schedule 02.09.2020    source источник


Ответы (2)


Нашел ответ после публикации этого вопроса, просто используя функцию выхода mvfilter, чтобы вытащить результаты совпадения.

column2 = mvfilter (соответствие (столбец1, тест))

person rockstar    schedule 02.09.2020

| eval column2=split(column1,",") | search column2="*test*"

не работает, поскольку split создает поле с несколькими значениями, которое представляет собой одно событие, содержащее одно поле, содержащее много значений. search для *test* все равно найдет это событие, даже если оно содержит abc1 и т. Д., Поскольку есть по крайней мере одно поле с *test*.

Что вы можете использовать, так это команду mvfilter, чтобы сузить многозначное поле до событий, которые вам нужны.

| eval column2=split(column1,",") | eval column2=mvfilter(match(column2,".*test.*"))

В качестве альтернативы этому подходу вы можете использовать регулярное выражение для извлечения того, что вам нужно.

| rex field=column1 max_match=0 "(<?column2>[^,]*test[^,]*)"

Тем не менее, в конце вам нужно будет использовать mvjoin, чтобы объединить несколько значений в одну строку.

| eval column2=mvjoin(column2, ",")
person Simon Duff    schedule 02.09.2020