數據分析一直是近幾年很是熱的一個話題,但如何進行數據分析目前業界尚未一個統一答案,從抽象的角度來講,先要有數據,而後有目標,最後給個工具從數據中提取目標這個就是數據分析過程。但目前數據和目標都相對比較容易獲取,但工具一直沒有比較理想的工具。公司根據這種狀況開發了一系列產品來緩解數據分析的過程,其中免費的命令行工具爲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日誌分析場景介紹》