Перейти к основному содержимому
Версия: 4.1

Использование 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")