Перейти к основному содержимому
Версия: 6.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 "Результат"

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

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