secsoso spl 语法说明
数据分析一直是近几年非常热的一个话题,但如何进行数据分析目前业界还没有一个统一答案,从抽象的角度来说,先要有数据,然后有目标,最后给个工具从数据中提取目标这个就是数据分析过程。但目前数据和目标都相对比较容易获取,但工具一直没有比较理想的工具。公司根据这种情况开发了一系列产品来缓解数据分析的过程,其中免费的命令行工具为secsoso。它们在搜索的时候都用了SPL (Search Processing Language)语言,本文就介绍SPL的搜索语法。
快速参考
面向SQL用户的SPL
以下内容不是 SQL 与 SPL搜索处理语⾔ (SPL) 之间的精确映射, 但是, 如果您熟悉 SQL,这⼀快速对⽐可以帮助您快速熟悉搜索命令的使⽤。
库概念
数据库概念 | Spl概念 | 注释 |
SQL 查询 | SPL搜索 | SPL搜索是对数据进⾏检索, 并且可以执⾏转换和报告操作。 可以将搜索所获得的结果通过管道符从⼀个命令传递或传输到另⼀个命令, 以对这些结果进⾏过滤、 修改、 重新排序和分组。 |
表/视图 | 搜索结果 | 对secsoso来说一个文件就是一个表的概念。 |
row | 结果/事件 | SPL搜索中的结果是⼀个包含字段(即, 列) 值的列表, 对应于表格的⾏。事件是指具有时间戳和原始⽂本的结果。 通常, 事件是⽇志⽂件中的⼀条记录, |
从 SQL 到SPL
说明:
完整语法为:file=(“/export/home/20190613/access.log”,” ”,“utf-8”)
其中/export/home/20190613/access.log为文件路径,“ ”为字段分割符。文件名可以是绝对路径(/export/home/20190613/access.log) 也可以是相对路径(access.log),其中file= 可以省略,默认分隔符为” ”,编码为”utf-8” 如果是文件特点是默认值也可以省略。
注意:
如果需要文件编码,则文件分割符不能省略
其中文件默认的列名为($1,$2,$3…) 注意索引是从1开始的,count($1)函数操作后的默认列名称为count_$1
SQL ⽤于搜索由列组成的关系数据库表。 SPL设计⽤于搜索由字段组成的集合。
对比表格:
SQL | SQL | SPL |
SELECT * | SELECT * | file=(filename,” ”,”utf-8”) |
WHERE | SELECT * | file=filename mycolumn=5 |
SELECT | SELECT mycolumn1, mycolumn2 | file=filename |
AND/OR | SELECT * | file=filename |
AS(别名) | SELECT mycolumn AS column_alias | file=filename |
BETWEEN | SELECT * | file=filename |
GROUP BY | SELECT mycolumn, avg(mycolumn) | file=filename mycolumn=value |
HAVING | SELECT mycolumn, avg(mycolumn) | file=filename mycolumn=value |
ORDER BY | SELECT * | file=filename |
SELECT DISTINCT | SELECT DISTINCT | file=filename |
SELECT TOP | SELECT TOP(5) | file=filename mycolum3="bar" |
赛克蓝德是一家数据分析公司,本着数据改变生活的理念,致力于提供方便好用的数据分析产品。
Spl概念
SPL主要有关键字,函数,管道组成。管道用来分割前后的逻辑。关键字可以放在管道后面执行,函数不能单独执行,只能放在关键字的后面。
Spl关键字
SPL的语法结构为:关键字 参数 管道 关键字 参数 管道等等以此类推。管道用|,关键字和参数就详见下面的章节,我们已搜索统计的一个需求为例,统计用户登录系统的数量:
search source="index" AND eventType = "login"|stats count(userName) by userName
其中search,stats就是关键字source="index" AND eventType = "login"就是search的参数,这个参数的意思是查询索引名为index的索引,eventType等于login的所有事件,两个条件是AND的关系,管道用|,count(userName) by username是stats的参数,含义是根据userName进行分组。
search搜索
搜索是在数据中找到数据的一个过程,产品支持两种搜索,一个是在数据分析平台中可以搜索elasticsearch(简称ES)中的数据,一个是用命令行secsoso可以搜索文档中的数据。
search <file> [条件查询]
其中search是关键字,在搜索的时候可以省略, file是用命令行secsoso搜索文件中的数据,后面紧跟着是条件。
条件查询的语法为:
(字段名称 操作符 值)关系(字段名称 操作符 值)…。
注意:file本身也是一种条件。
file的语法为:file=("文件名"," "),其中第二个参数是分隔符,默认分隔符为空格,通过分隔符来确定文件中的每一列,默认的列名为$1,$2,$3等等,用命令行secsoso工具,如果默认分隔符为空格可以直接简化为:secsoso "文件名" 条件。
字段名称:
对ES中,字段名称就是ES的每一列,对于文件就是通过分隔符分割后的每一列。
操作符:
系统支持以下操作符语法:
操作符 | 语义 |
=或者== | 等于 |
!= 或者<>或者<=> | 不等于 |
< | 小于 |
<=或者!> | 小于等于|不小于 |
> | 大于 |
>=或者!, | 大于等于|不小于 |
In | 包括 |
not in | 不包括 |
查询值支持以下几种语法:
精确查询:输入一个完整的值。
模糊查询:支持*?。* 可以匹配零个、单个或多个字符,? 可以匹配一个字符,*和?可以同时使用,且可以放在字段值的任意位置,*和?至少要保留一个才能进行模糊查询,否则就是精确查询。
正则查询:/regexp/,正则表达式前后必须加上正斜杠。
关系:
要使用多个条件查询,需要指定条件之间的关系:AND、OR。多个条件查询默认的关系是AND。关系运算符不区分大小写。AND优先级高于OR。AND是与的关系OR是或的关系。
也可使⽤括号对搜索字符串的各部分进⾏分组,括号里的条件优先。
fields保留或删除字段
搜索结果中展示的都是全部字段,使用fields命令可以根据字段列表条件保留或删除搜索结果中的字段。语法:
fields [+|-] field1, field2, field3…
+|-,如果指定了加号(+)则代表在结果中只保留field_list这些字段,反之指定了减号(-)则在结果中删除field_list这些字段。默认值是+,可缺省。
rename字段重命名
rename 命令是修改搜索结果中的列名。语法为:
rename field_name as field_name_other
sort结果排序
sort是对返回结果集的某一个或者多个字段进行排序。语法为:
sort [limit] [+|-] field1, field2, field3…
含义jiesh :sort [结果个数] [正序|逆序] 字段名,多个字段名用逗号分开。
多个字段名用小写的逗号隔开。默认为正序(+)
eventcount获取总数
使⽤ eventcount命令对数据进行计数。返回字段名为event_count ,值为总记录数的一条记录。语法为:
…|eventcount
eval增加字段
eval在原有日志中添加一个新的field,新字段将根据已有字段进行逻辑运算生成,如通过算术运算、字符串运算等方式。如果您指定的字段名称和搜索结果中已经存在的字段名称匹配, eval 表达式中的结果会覆盖该字段中的值。可在⼀个搜索中使⽤逗号将多个 eval 表达式链接起来, 以分隔后续表达式。 该搜索从左⾄右处理多个 Eval 表达式, 并允许您在后续表达式中引⽤之前已评估过的字段。
语法:
eval <field>=<expression>["," <field>=<expression>]...
expression支持的函数包括比和条件函数、加密函数、日期和时间函数、数学函数、文本函数和三⾓函数和双曲函数
示例:
在返回的结果中增加一列,得到小写的用户名,使⽤ lower 函数。
... | eval lowuser = lower(username)
stats统计
stats用于对计算结果集进行聚合统计, 如平均数、 计数和总和。 类似于 SQL 聚合。 如果 stats 命令在没有 BY ⼦句的情况下使⽤,将只返回⼀⾏, 也就是整个进来的结果集的聚合。 如果使⽤了 BY ⼦句, 将为 BY ⼦句中指定的每个唯⼀值返回⼀⾏。语法为:
stats (stats-function(field) [AS field])...[BY field-list]
stats-function支持的函数主要是统计函数。
Stats 和 Eval 命令的区别
stats 命令根据事件中的字段计算统计信息。 eval 命令使⽤现有字段和任意表达式在您的事件中新建字段。
示例
列出文件中访问次数最多的10个IP
secsoso 'file=("/export/home/20190613/access.log"," ")|stats count($1) by $1|sort 10 -count_$1'
说明:完整语法为:file=(“文件名”,分割符,“编码”)
其中分割符默认为“ ” 编码默认为utf-8
其中file= 可以省略,如果是文件特点是默认值也可以省略
其中文件默认的列名为($1,$2,$3…) 注意索引是从1开始的
也可以给字段重命名以友好方式显示,这个是简化语法:结果同上。
secsoso ‘access.log|rename $1 as ip |stats count(ip) by ip|sort 10 -count_ip’
从中间件文件中找到密码猜测的ip,密码猜测条件是5分钟登录失败10次以上的
secsoso 'access.log $6="*POST" $7="*/login" $9="200"| eval date=$4.to_date("[dd/MMM/yyyy:HH:mm:ss")|stats count($1) as count by tspan(date,"5m"),$1| search count>10|stats sum(count) by $1'
- 点赞
- 收藏
- 关注作者
评论(0)