Вывести строковый массив полезной нагрузки json в splunk

#regex #splunk #splunk-query

#регулярное выражение #splunk #splunk-запрос

Вопрос:

Мне нужно напечатать массив строк вместе с одним полем в моем объекте json.

Данные:

 { "key1":"val1",  "key2":"value2",  "codes":["apple","mango","banana","orange"], "key3_conditional":"yes"}
 

Мой поисковый запрос:

 <My search query>
| rex "|(?<payload>[^|]*)$"
| spath input=payload
| rex ""codes":"(?<codes>[^"]*)"
| eval is_unknown=if(isnotnull(key3_conditional), key3_conditional, "no")
| table codes, is_unknown
 

Желаемый результат

 codes                               | is_unknown
--------------------------------------------------
apple, mango, banana, orange        | yes
 

В настоящее время это отображает только 1-е значение в кодах, т.Е. apple И мне нужны все значения кодов через запятую. Я предполагаю, что есть какая-то проблема с моим регулярным выражением. Пожалуйста, предложите.

Комментарии:

1. Вы можете получить более быстрые ответы по адресу community.splunk.com который активно контролируется сотрудниками Splunk.

Ответ №1:

Если эти данные вводятся в JSON, вам не придется rex их выводить

Если нет, то проблема заключается в вашем регулярном выражении

Попробуйте это на regex101.com — вы увидите, что получаете только первое значение, потому что останавливаетесь на литерале "

Попробуйте это вместо:

 ...
| rex field=_raw "codes":[(?<codes>[^]] )"
| eval codes=split(replace(codes,""",""),",")
 

Это превратит codes в многозначное поле

Если вас не волнует, что он многозначный, вы можете просто сделать:

 | eval codes=replace(codes,""","")
 

для извлечения кавычек

Комментарии:

1. Спасибо. Это работает. Я заметил некоторую проблему с этим, и вместо этого я использую это | rex field=_raw ""codes":[(?<codes>[^]] )" для захвата поля как "codes"

2. Я полагаю, что это была опечатка, но в 1-м eval " отсутствовал. | eval codes=split(replace(codes,""",""),",")

3. @AyushKumar — да, похоже, я пропустил кавычки. Теперь исправлено 🙂