Использование eval и функций
Команда eval
служит для переопределения значений в полях. Может использовать математические операции, конкатенацию строк, выражения сравнения, булевские выражения, функции.
eval
оперирует со следующими базовыми типами данных:
String
Numeric
Booleans
Null
Выражение eval
требует, чтобы значения полей соответствовали типу операции и в результирующем значении стремится сохранить исходный тип данных. Например, за исключением сложения, арифметические операции могу не давать действительных результатов, если значения не являются числовыми. Когда выполняется конкатенации значений с точкой (.), команда eval
определяет оба значения как String
, независимо от их фактического типа.
Одна из ключевых возможностей команды eval
– это работа с условными операциями.
В конструкциях if
и case
в теле условия можно использовать функции сравнения ( in
, like
, isnull
, isnotnull
и др.) и простые логические выражения.
Конкатенация строк
Запрос создаст новое поле destination.geo.location
по шаблону "destination.geo.city_name/destination.geo.continent_name
".
source sm_cs_threat_indexes
| eval destination.geo.location=destination.geo.continent_name + "/" + destination.geo.city_name
| table destination.geo.location, destination.geo.continent_name, destination.geo.city_name
Создание нового поля из служебного поля
Запрос выведет несколько полей в виде таблицы и новое поле "ID индекса". Значение поля будет присвоено из служебного поля index
.
source sm_cs_auth_indexes
| table destination.address, destination.ip, source.ip, event.action
| eval index_name = _index
| rename destination.address as "Адрес целевого сервера", destination.ip as "IP целевого сервера", source.ip as "IP источника", event.action as "Событие", index_name as "ID индекса"
Работа с условными операторами if, case
В запросе, команда eval
создаст новое поле event.log.out
и присвоит ему значение "Выход", если значение поля event.action
равно "logged-out", иначе будет присвоено значение "-".
source sm_cs_auth_indexes
| table destination.address, destination.ip, source.ip, event.action
| eval event.log.out = if(event.action == "logged-out", "Выход", "-")
| rename destination.address as "Адрес целевого сервера", destination.ip as "IP целевого сервера", source.ip as "IP источника", event.action as "Событие", event.log.out as "Результат"
В запросе, команда case
будет сравнивать три значение в поле event.action
. Если использовать имя уже существующего поля, то его значение перезапишется результатами eval
.
source sm_cs_auth_indexes
| table destination.address, destination.ip, source.ip, event.action
| eval event.log.out=case(event.action == "logged-out", "Выход", event.action == "logged-in", "Вход", event.action == "kerberos-authentication-ticket-requested", "kerberos")
| rename destination.address as "Адрес целевого сервера", destination.ip as "IP целевого сервера", source.ip as "IP источника", event.action as "Событие", event.log.out as "Результат"
Использование логического выражения
Запрос использует комбинацию условного оператора if
и логического выражения or
(или).
source sm_cs_auth_indexes
| table destination.address, destination.ip, source.ip, event.action
| eval event.log.out = if(event.action == "logged-out" or event.action == "logged-in" , "Вход/Выход", "Kerberos")
| rename destination.address as "Адрес целевого сервера", destination.ip as "IP целевого сервера", source.ip as "IP источника", event.action as "Событие", event.log.out as "Результат"
Использование команды like
Запрос проверяет значение первого аргумента на соответствие шаблону, заданному во втором аргументе. Если значение поля event.action
совпадает с шаблоном «%logged%», полю event.log.out
присваиваем значение "Вход/Выход", иначе "Kerberos".
source sm_cs_auth_indexes
| table destination.address, destination.ip, source.ip, event.action
| eval event.log.out = if(like(event.action,"%logged%"), "Вход/Выход", "Kerberos")
| rename destination.address as "Адрес целевого сервера", destination.ip as "IP целевого сервера", source.ip as "IP источника", event.action as "Событие", event.log.out as "Результат"
Математические и статистические операции
Запрос выведет итоговую стоимость заказа по каждому пользователю на текущий момент.
source food_orders
| stats latest(total_price) as "total_price_USD" by user_id
| rename user_id as "id пользователя"
Запрос преобразует поле total_price_USD
в total_price_rub
(переведет цену из usd в rub), и с помощью команды round
, округлит его до двух знаков после запятой.
source food_orders
| stats latest(total_price) as total_price_usd by user_id
| eval total_price_rub = round((total_price_usd * 94.34),2)
| table total_price_usd, total_price_rub, user_id
| rename total_price_usd as "Итоговая стоимость в usd", total_price_rub as "Итоговая стоимость в rub", user_id as "id пользователя"
Работа с текстом
Запрос переведет содержимое поля snyk.vulnerabilities.credit
в верхий регистр.
source sm_cs_vulnerability_indexes
| table snyk.vulnerabilities.cvss3, snyk.vulnerabilities.identifiers.alternative, snyk.vulnerabilities.credit
| eval snyk.vulnerabilities.credit_upper = upper(snyk.vulnerabilities.credit)
Команда trim
позволяет убрать из значения поля подстроку в соответствии с шаблоном. Следующий запрос добавит новое поле snyk_trim
, которому присвоит значение поля snyk.vulnerabilities.identifiers.alternative
с удаленной подстрокой "SNYK-".
source sm_cs_vulnerability_indexes
| table snyk.vulnerabilities.credit, snyk.vulnerabilities.credit, snyk.vulnerabilities.identifiers.alternative
| eval snyk.vulnerabilities.credit_upper = upper(snyk.vulnerabilities.credit)
| eval snyk_trim = trim(snyk.vulnerabilities.identifiers.alternative, "SNYK-")
Команда replace
заменит значение поля snyk_trim
на вторую и третью найденную группу в регулярном выражении, то есть на текст после первого "-".
source sm_cs_vulnerability_indexes
| table snyk.vulnerabilities.credit, snyk.vulnerabilities.credit, snyk.vulnerabilities.identifiers.alternative
| eval snyk.vulnerabilities.credit_upper = upper(snyk.vulnerabilities.credit)
| eval snyk_trim = trim(snyk.vulnerabilities.identifiers.alternative, "SNYK-")
| eval snyk_replace = replace(snyk_trim, "(\w+)\-(\w+)\-(\w+)", "$2-$3")