secsoso spl 语法说明

举报
Joey啊 发表于 2019/09/20 17:52:06 2019/09/20
【摘要】 数据分析一直是近几年非常热的一个话题,但如何进行数据分析目前业界还没有一个统一答案,从抽象的角度来说,先要有数据,然后有目标,最后给个工具从数据中提取目标这个就是数据分析过程。但目前数据和目标都相对比较容易获取,但工具一直没有比较理想的工具。公司根据这种情况开发了一系列产品来缓解数据分析的过程,其中免费的命令行工具为secsoso。它们在搜索的时候都用了SPL (Search Process...

数据分析一直是近几年非常热的一个话题,但如何进行数据分析目前业界还没有一个统一答案,从抽象的角度来说,先要有数据,然后有目标,最后给个工具从数据中提取目标这个就是数据分析过程。但目前数据和目标都相对比较容易获取,但工具一直没有比较理想的工具。公司根据这种情况开发了一系列产品来缓解数据分析的过程,其中免费的命令行工具为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 *
FROM mytable

file=(filename,” ”,”utf-8”)

WHERE

SELECT *
FROM mytable
WHERE mycolumn=5

file=filename mycolumn=5

SELECT

SELECT mycolumn1, mycolumn2
FROM mytable

file=filename
| FIELDS mycolumn1, mycolumn2

AND/OR

SELECT *
FROM mytable
WHERE (mycolumn1="true"
OR mycolumn2="red")
AND mycolumn3="blue"

file=filename
 (mycolumn1="true"
OR mycolumn2="red")
AND mycolumn3="blue"
注意:SPL 中隐含有 AND 运算符, 不需要
指定。 对于此⽰例, 您还可以使⽤:
file=filename
(mycolumn1="true"
OR mycolumn2="red")
mycolumn3="blue"

AS(别名)

SELECT mycolumn AS column_alias
FROM mytable

file=filename
| RENAME mycolumn as column_alias
| FIELDS column_alias

BETWEEN

SELECT *
FROM mytable
WHERE mycolumn
BETWEEN 1 AND 5

file=filename
mycolumn>=1 mycolumn<=5

GROUP BY

SELECT mycolumn, avg(mycolumn)
FROM mytable
WHERE mycolumn=value
GROUP BY mycolumn

file=filename  mycolumn=value
| STATS mycolumn, avg(mycolumn) BY mycolumn
 

HAVING

SELECT mycolumn, avg(mycolumn)
FROM mytable
WHERE mycolumn=value
GROUP BY mycolumn
HAVING avg(mycolumn)=value

file=filename  mycolumn=value
| STATS mycolumn ,avg(mycolumn) BY mycolumn
| SEARCH avg_mycolumn=value

ORDER BY

SELECT *
FROM mytable
ORDER BY mycolumn desc

file=filename
| SORT -mycolumn
在 SPL 中, 您可在字段名称前⾯使⽤负号 (- ) 进⾏降序排列,默认是升序排列。

SELECT DISTINCT

SELECT DISTINCT
mycolumn1, mycolumn2
FROM mytable

file=filename
| stats mycolumn1, mycolumn2 by mycolumn1, mycolumn2

SELECT TOP

SELECT TOP(5)
mycolum1,
mycolum2
FROM mytable1
WHERE mycolum3 = "bar"
ORDER BY mycolum1 mycolum2

file=filename mycolum3="bar"
| FIELDS mycolum1 mycolum2
| SORT 5 mycolum1 mycolum2

赛克蓝德是一家数据分析公司,本着数据改变生活的理念,致力于提供方便好用的数据分析产品。

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'


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。