数据分析一直是近几年很是热的一个话题,但如何进行数据分析目前业界尚未一个统一答案,从抽象的角度来讲,先要有数据,而后有目标,最后给个工具从数据中提取目标这个就是数据分析过程。但目前数据和目标都相对比较容易获取,但工具一直没有比较理想的工具。公司根据这种状况开发了一系列产品来缓解数据分析的过程,其中免费的命令行工具为secsoso。它们在搜索的时候都用了SPL (Search Processing Language)语言,本文就介绍SPL的搜索语法。正则表达式
如下内容不是 SQL 与 SPL搜索处理语⾔ (SPL) 之间的精确映射, 可是, 若是您熟悉 SQL,这⼀快速对⽐能够帮助您快速熟悉搜索命令的使⽤。数据库
库概念express
数据库概念运维 |
Spl概念elasticsearch |
注释函数 |
SQL 查询工具 |
SPL搜索编码 |
SPL搜索是对数据进⾏检索, 而且能够执⾏转换和报告操做。 能够将搜索所得到的结果经过管道符从⼀个命令传递或传输到另⼀个命令, 以对这些结果进⾏过滤、 修改、 从新排序和分组。加密 |
表/视图spa |
搜索结果 |
对secsoso来讲一个文件就是一个表的概念。 |
row |
结果/事件 |
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的语法结构为:关键字 参数 管道 关键字 参数 管道等等以此类推。管道用|,关键字和参数就详见下面的章节,咱们已搜索统计的一个需求为例,统计用户登陆系统的数量:
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进行分组。
搜索是在数据中找到数据的一个过程,产品支持两种搜索,一个是在数据分析平台中能够搜索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 [+|-] field1, field2, field3…
+|-,若是指定了加号(+)则表明在结果中只保留field_list这些字段,反之指定了减号(-)则在结果中删除field_list这些字段。默认值是+,可缺省。
rename 命令是修改搜索结果中的列名。语法为:
rename field_name as field_name_other
sort是对返回结果集的某一个或者多个字段进行排序。语法为:
sort [limit] [+|-] field1, field2, field3…
含义jiesh :sort [结果个数] [正序|逆序] 字段名,多个字段名用逗号分开。
多个字段名用小写的逗号隔开。默认为正序(+)
使⽤ eventcount命令对数据进行计数。返回字段名为event_count ,值为总记录数的一条记录。语法为:
…|eventcount
eval在原有日志中添加一个新的field,新字段将根据已有字段进行逻辑运算生成,如经过算术运算、字符串运算等方式。若是您指定的字段名称和搜索结果中已经存在的字段名称匹配, eval 表达式中的结果会覆盖该字段中的值。可在⼀个搜索中使⽤逗号将多个 eval 表达式连接起来, 以分隔后续表达式。 该搜索从左⾄右处理多个 Eval 表达式, 并容许您在后续表达式中引⽤以前已评估过的字段。
语法:
eval <field>=<expression>["," <field>=<expression>]...
expression支持的函数包括比和条件函数、加密函数、日期和时间函数、数学函数、文本函数和三⾓函数和双曲函数
示例:
在返回的结果中增长一列,获得小写的用户名,使⽤ lower 函数。
... | eval lowuser = lower(username)
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'
赛克蓝德是一家数据分析公司,本着数据改变生活的理念,致力于提供方便好用的数据分析产品。
更多示例请参考《运维利器:WEB日志分析场景介绍》