Поделиться через


Оператор parse-kv

Область применения: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

Извлекает структурированные сведения из строкового выражения и представляет сведения в форме key/value.

Поддерживаются следующие режимы извлечения:

Синтаксис

Указанный делиметр

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