概述
數據分析一直是近幾年非常熱的一個話題,但如何進行數據分析目前業界還沒有一個統一答案,從抽象的角度來說,先要有數據,然後有目標,最後給個工具從數據中提取目標這個就是數據分析過程。但目前數據和目標都相對比較容易獲取,但工具一直沒有比較理想的工具。公司根據這種情況開發了一系列產品來緩解數據分析的過程,其中免費的命令行工具爲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'
更多示例請參考《運維利器:WEB日誌分析場景介紹》