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

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

Использование команды like

Математические и статистические операции​

Запрос выведет итоговую стоимость заказа по каждому пользователю на текущий момент.

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")

Работа с текстом