Как сформировать ответный запрос, чтобы разбить поле и создать отдельные поля по максимальному количеству разделов? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть несколько строк, подобных приведенным ниже, которые были возвращены моим поиском в спланке:

"CN=aa,OU=bb,DC=cc,DC=dd,DC=ee"
"CN=xx,OU=bb,DC=cc,DC=yy,DC=zz"
"CN=ff,OU=gg,OU=hh,DC=ii,DC=jj"
"CN=kk,DC=ll,DC=mm"

Примечание: CN, OU, D C может быть 0 или много.

Моя конечная цель чтобы найти все OU, как показано ниже.
(комбинации также должны быть уникальными.)
(все пустые строки могут быть исключены.)
например:

bb     (blank)
gg      hh
(blank) (blank)

Запрос то, что я использую в настоящее время, очень наивно.
Плюс это не обобщенно c.
Это сработает, если хотя бы один из моих результатов разбит на 5 частей (0,1,2,3,4).
Но это не сработает и даст пустые результаты, если ни один из моих результатов не разделен на 5 частей (0,1,2,3,4), т.е. все они дают менее 5 частей.

index=xx sourcetype=yy
| fields s
| rex field=s mode=sed "s/,DC=.*//g"
| eval temp=split(s,",OU=")
| eval a=mvindex(temp,1)
| eval b=mvindex(temp,2)
| eval c=mvindex(temp,3)
| eval d=mvindex(temp,4)
| dedup a b c d
| table a,b,c,d

Как сделать его обобщенным c т.е. получить счетчик разбиения и сделать поля в соответствии с максимальной длиной разбиения?

1 Ответ

0 голосов
/ 08 мая 2020

Строки rex для извлечения этих вещей должны выглядеть примерно так: после (примечание: \w+ соответствует классу символов "символы слова" [A-Za-z0-9_]):

| rex field=s max_match=0 "CN=(?<cn>\w+)\,?"
| rex field=s max_match=0 "OU=(?<ou>\w+)\,?"
| rex field=s max_match=0 "DC=(?<dc>\w+)\,?"

Это должно сделать многозначные поля в каждом событии для всех записей cn, dc и ou

Затем вы можете split отделить их как , необходимый , например:

| eval cn=split(cn,"split string")
...