Оператор parse-kv
Область применения: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Извлекает структурированные сведения из строкового выражения и представляет сведения в форме key/value.
Поддерживаются следующие режимы извлечения:
- Указанный делиметр: извлечение на основе указанных разделителей, которые определяют, как ключи и значения и пары отделены друг от друга.
- Не указанная делиметра: извлечение без необходимости указывать разделители. Любой неэлементный символ считается разделителем.
- Regex: извлечение на основе регулярных выражений.
Синтаксис
Указанный делиметр
T |
parse-kv
KeyList (
as
(
=
)
pair_delimiter
with
PairDelimiter KvDelimiter kv_delimiter
=
,
[ quote
=
,
QuoteChars ... [,
escape
=
EscapeChar ...]] [ ],
greedy
=
true
)
Неопределенный разделитель
Список ключей выражений (
with
(
as
)
T parse-kv
|
[ =
quote
кавычки ... [,
escape
=
EscapeChar ...]])
Регулярное выражение
(
as
T |
parse-kv
KeyList =
(
with
regex
)
RegexPattern)
)
Дополнительные сведения о соглашениях синтаксиса.
Параметры
Имя (название) | Type | Обязательно | Описание |
---|---|---|---|
Выражение | string |
✔️ | Выражение, из которого необходимо извлечь значения ключей. |
KeyList | string |
✔️ | Разделенный запятыми список имен ключей и их типов данных значений. Порядок ключей не должен соответствовать порядку, в котором они отображаются в тексте. |
PairDelimiter | string |
Разделитель, разделитель, разделяющий пары значений ключей друг от друга. | |
KvDelimiter | string |
Разделитель, который отделяет ключи от значений. | |
Кавычки | string |
Одно-или двухзначный строковый литерал, представляющий открывающие и закрывающие кавычки, с которыми может быть заключено имя ключа или извлеченное значение. Параметр может повторяться, чтобы указать отдельный набор открывающих и закрывающих кавычки. | |
EscapeChar | string |
Однозначный строковый литерал, описывающий символ, который может использоваться для экранирования специальных символов в кавычках. Параметр может повторяться, если используются несколько escape-символов. | |
RegexPattern | string |
Регулярное выражение , содержащее две группы записи точно. Первая группа представляет имя ключа, а вторая группа представляет значение ключа. |
Возвраты
Исходное табличное выражение ввода T, расширенное столбцами на указанные ключи для извлечения.
Примечание.
- Если ключ не отображается в записи, соответствующее значение столбца будет либо
null
пустой строкой в зависимости от типа столбца. - Извлекаются только ключи, перечисленные в операторе.
- Первый вид ключа извлекается, а последующие значения игнорируются.
- При извлечении ключей и значений начальные и конечные пробелы игнорируются.
Примеры
Извлечение с четко определенными разделителями
В следующем примере ключи и значения разделены четко определенными разделителями. Эти делиметры являются символами запятых и двоеточий.
print str="ThreadId:458745723, Machine:Node001, Text: The service is up, Level: Info"
| parse-kv str as (Text: string, ThreadId:long, Machine: string) with (pair_delimiter=',', kv_delimiter=':')
| project-away str
Выходные данные
Текст | ThreadId | Компьютер |
---|---|---|
Служба выполняется | 458745723 | Node001 |
Извлечение с кавычением значений
Иногда имена ключей или значения упаковываются в кавычки, что позволяет самим значениям содержать символы разделителя. В следующих примерах показано, как quote
аргумент используется для извлечения таких значений.
print str='src=10.1.1.123 dst=10.1.1.124 bytes=125 failure="connection aborted" "event time"=2021-01-01T10:00:54'
| parse-kv str as (['event time']:datetime, src:string, dst:string, bytes:long, failure:string) with (pair_delimiter=' ', kv_delimiter='=', quote='"')
| project-away str
Выходные данные
время события. | src | dst | байт | сбой, |
---|---|---|---|---|
2021-01-01 10:00:54.0000000 | 10.1.1.123 | 10.1.1.124 | 125 | прервано подключение |
В следующем примере используются различные кавычки открытия и закрытия:
print str='src=10.1.1.123 dst=10.1.1.124 bytes=125 failure=(connection aborted) (event time)=(2021-01-01 10:00:54)'
| parse-kv str as (['event time']:datetime, src:string, dst:string, bytes:long, failure:string) with (pair_delimiter=' ', kv_delimiter='=', quote='()')
| project-away str
Выходные данные
время события. | src | dst | байт | сбой, |
---|---|---|---|---|
2021-01-01 10:00:54.0000000 | 10.1.1.123 | 10.1.1.124 | 125 | прервано подключение |
Сами значения могут содержать правильно экранированные символы кавычки, как показано в следующем примере:
print str='src=10.1.1.123 dst=10.1.1.124 bytes=125 failure="the remote host sent \\"bye!\\"" time=2021-01-01T10:00:54'
| parse-kv str as (['time']:datetime, src:string, dst:string, bytes:long, failure:string) with (pair_delimiter=' ', kv_delimiter='=', quote='"', escape='\\')
| project-away str
Выходные данные
Время | src | dst | байт | сбой, |
---|---|---|---|---|
2021-01-01 10:00:54.0000000 | 10.1.1.123 | 10.1.1.124 | 125 | удаленный узел отправил "bye!" |
Извлечение в жадном режиме
Существуют случаи, когда неквотируемые значения могут содержать разделители пар. В этом случае используйте greedy
режим, чтобы указать оператору, чтобы проверить до следующего внешнего вида ключа (или конца строки) при поиске окончания значения.
В следующих примерах сравнивается работа оператора с заданным режимом и без нее greedy
.
print str='name=John Doe phone=555 5555 city=New York'
| parse-kv str as (name:string, phone:string, city:string) with (pair_delimiter=' ', kv_delimiter='=')
| project-away str
Выходные данные
name | phone | city |
---|---|---|
Джон | 555 | Новый |
print str='name=John Doe phone=555 5555 city=New York'
| parse-kv str as (name:string, phone:string, city:string) with (pair_delimiter=' ', kv_delimiter='=', greedy=true)
| project-away str
Выходные данные
name | phone | city |
---|---|---|
Александр Демидов | 555 5555 | Нью-Йорк |
Извлечение без четко определенных разделителей
В следующем примере любой нефанумерный символ считается допустимым разделителем:
print str="2021-01-01T10:00:34 [INFO] ThreadId:458745723, Machine:Node001, Text: Started"
| parse-kv str as (Text: string, ThreadId:long, Machine: string)
| project-away str
Выходные данные
Текст | ThreadId | Компьютер |
---|---|---|
Запуск | 458745723 | Node001 |
В этом режиме разрешены кавыки и экранирование значений, как показано в следующем примере:
print str="2021-01-01T10:00:34 [INFO] ThreadId:458745723, Machine:Node001, Text: 'The service \\' is up'"
| parse-kv str as (Text: string, ThreadId:long, Machine: string) with (quote="'", escape='\\')
| project-away str
Выходные данные
Текст | ThreadId | Компьютер |
---|---|---|
Служба " работает | 458745723 | Node001 |
Извлечение с помощью regex
Если разделители не определяют структуру текста достаточно хорошо, извлечение на основе регулярных выражений может оказаться полезным.
print str=@'["referer url: https://hostname.com/redirect?dest=/?h=1234", "request url: https://hostname.com/?h=1234", "advertiser id: 24fefbca-cf27-4d62-a623-249c2ad30c73"]'
| parse-kv str as (['referer url']:string, ['request url']:string, ['advertiser id']: guid) with (regex=@'"([\w ]+)\s*:\s*([^"]*)"')
| project-away str
Выходные данные
URL-адрес ссылки на ссылку | URL-адрес запроса | идентификатор рекламодателя |
---|---|---|
https://hostname.com/redirect?dest=/?h=1234 |
https://hostname.com/?h=1234 |
24fefbca-cf27-4d62-a623-249c2ad30c73 |