机器数据分析平台

  • 机器数据分析平台 > 产品手册 > SPL参考手册 > search

    search

    最近更新时间:2019-10-17 14:16:19

    search 命令用于搜索、过滤原始日志,一般来说,search 命令是spl 管道的首个命令,用来筛选出需用其他 spl 命令进行分析的日志。若 search 命令不是管道中的首个命令,它用于筛选之前命令的结果。

    语法:

    search <logical-expression>

    语法介绍

    在 spl 语句的开头,通常会输入 search 命令搜索日志,但 search 关键词是可以省略的,如

    search post=*
    

    post=* 
    

    是等价的。

    在搜索时,若您搜索的数据包含以下符号,需要以双引号 "" 包含起来:

    +  -  
    &&  ||  !
    ( )  { }  [ ] 
    ^  ”  ~  *  ?  :  \
    

    搜索说明

    1.在原始日志中搜索字符串,需指定完整的字符串内容。如:
    原始日志中有短语 error ,需在搜索栏输入“error”,输入“e”、“erro”均无法搜到该条日志。

    2.搜索字段,需指定完整的字段及值。如:

    输入 type="error" 返回包含 type="error"的日志结果,输入 type=* 返回所有包含 type字段的结果,输入type="e"、type="erro"均无法搜到该条日志。

    需注意,搜索加有引号的短语 "web error" 与不加引号时的搜索不同。搜索 web error 时,系统会返回包含"web" 和 "error" 的事件。搜索 "web error" 时,系统只返回包含短语 "web error" 的事件。

    搜索条件编写规范

    搜索条件编写规范说明如下:

    通配符: *
    逻辑运算符: AND, OR, NOT, ( )
    字段值完全匹配: apache.method="get"
    字段值模糊匹配: apache.status=*
    全文短语检索: "ACCESS DENIED" 
    全文多关键词检索: ACCESS DENIED
    字段数值范围: apache.status<=400 或 apache.status>400
    字段值在列表中: apache.status in (200, 400)
    简单正则表达式: /frontend[0-9]2/
    

    详细语法规则的解释如下:

    名称 语义
    * 查询所有内容
    AND 查询交集
    OR 查询并集
    NOT 查询不包括 NOT 子句的结果,如 NOT status:200 不包含 status 值为 200 的数据
    in 查询包含某个值的数据,如 status IN (400,500) 查询 status 值为 400或 500 的数据
    () 把一个或多个搜索语句合并成一个搜索语句,提升优先级,如 status IN (400,500) 查询 status 值为400或500 的数据
    \ 转义字符,⽤于“转义”特定字符。如正则表达式搜索时表达式包含反斜杠的情况,如 request_path:/\/query\/abc\/./ 查询 request_path 字段匹配正则表达式 /query/abc/. 的数据
    >,=,<,<=,>=,!= 区间查询,如 status:>=500 查询 status 大于 500 的数据

    条件编写规范说明:

    1.查询两个字符串的交集可省略 AND,即 query1 AND query2 等价于 query1 query2。
    2.NOT 运算符仅适用于紧随 NOT 之后的字符串,若要查询排除多个字符串的结果,需写多个NOT 子句并将其用AND连接。如:NOT query1 AND NOT query2。

    通配符查询

    1.使用 ? 代替一个字符, * 代替0或者多个字符。

    比如:

    type=qu?ck type=bro*
    

    注意使用这个查询会消耗大量资源,并且速度会降低。

    正则表达式查询

    正则表达式查询条件编写时,以"/"开头和结尾。

    比如:

    name=/joh?n(ath[oa]n)/
    

    需注意,正则表达式中使用管道符 | 来表达 OR 条件。例如, A或B 的表达式为 A|B。由于管道符在 SPL 中⽤于分隔命令,正则表达式中用到管道符时,需用“”括起来。

    查询举例

    字段 name ,值等于 a 的记录:

    name="a"
    

    字段 ip ,内容等于 a 或 b 的记录:

    ip in ("a", "b") 
    

    字段 hosts ,等于 a 或者 b ,且不等于 c 的记录:

    hosts in (a,b)  AND (NOT hosts="c")
    

    字段 ip ,等于 a 或 b ,同时字段 hosts ,内容等于 c 的记录:

    ip in (a, b, c) AND (hosts="c")
    

    字段 count ,值大于 5 的记录:

    count>=5
    

    合理使用搜索命令,能够大大加快我们搜索和分析的效率。

    如下日志:

    pid:89322 processname:"C:\Windows\System32\services.exe" logonType:5 username:"WIN-LE6R9OTNFO7$"
    

    如果要搜索包含用户 WIN-LE6R9OTNFO7$ 的所有日志,可以将数据进行 key-value 解析,提取出 username 字段,我们可以比较容易的写出搜索条件:
    username="WIN-LE6R9OTNFO7$"

    优化搜索

    搜索出包含"WIN-LE6R9OTNFO7$"关键词的日志,然后在搜索结果中比对用户名字段,搜索条件可以优化如下:

    "WIN-LE6R9OTNFO7$" AND username="WIN-LE6R9OTNFO7$"
    

    系统通过 "WIN-LE6R9OTNFO7$" 关键词在原始日志中过滤出包含 "WIN-LE6R9OTNFO7$" 的日志,再过滤出 username="WIN-LE6R9OTNFO7$"的日志,与直接从原始日志中过滤包含 username="WIN-LE6R9OTNFO7$" 的日志相比,查询效率显著提高。

    以上内容是否对您有帮助?
  • Icon helper
    Icon free helper
    Close