正则表达式
正则表达式是什么?
正则表达式(RegEx)可以单独使用,也可以与基本搜索文档中的任何搜索功能一起使用,以提供高级功能,并可以极大地增强关键字搜索的能力。RegEx搜索被放置在两个斜杠(" / ")内。
为什么使用正则表达式?
正则表达式具有搜索复杂数据和自定义日志格式的强大功能
- 与关键字搜索不同,RegEx可以执行部分和不区分大小写的匹配。
- RegEx搜索可以用于搜索带有特殊字符的事件,如斜杠(/),双引号(")
- RegEx可以与KVP和JSON搜索相结合,以匹配带有变量值的字段。*例如,如果你发送你的Apache Access Logs到InsightOps的JSON格式,你可以使用remoteIP键找到任何值,代表来自几内亚国家的ip(所有在几内亚的ip是在197.149.192.0 - 197.149.225.225)
1remoteIP = /“197 \ .149 \[12]。[0-59][0 - 9]* \ \[0]。/ NX”/
关键字搜索
关键字搜索将对所有日志工作,无论其格式。关键字搜索在默认情况下是区分大小写的,并且将匹配一个完整的字符串,直到它被非字母字符分隔。例如,给定下面的日志事件。
14月13日20:01:01主机名掌管部分(/ etc / cron.hourly)[26263]:从0 anacron2Apr 13 20:01:01 hostname run-parts(/etc/cron.hour)[26272]: finished 0anacron
InsightOps将通过搜索“etc”或“run”匹配事件,因为文本由空格和非字母字符分隔。InsightOps不会匹配“小时”,但会匹配“小时”。
关键词搜索可以结合逻辑操作符,例如“starting AND finished”将返回两个日志事件。
注意:当您列出一系列关键字时,InsightOps自动假定每个关键字之间有一个AND。如果你想匹配一个精确的字符串,在搜索的周围放置“双引号”。
使用正则表达式关键字匹配
部分匹配
默认情况下,regex搜索将返回部分匹配。下面的搜索将匹配" complete ", " complete "和" completed "
1(/完成/)
大小写不敏感的搜索
使用不区分大小写的关键字搜索意味着下面的搜索将匹配Error、Error、Error和任何其他形式的大写
1我在哪里(/错误/)
建设与常规快递业务
正则表达式使用特殊字符来支持搜索更高级的模式。这些字符是*
,+
,.
,\
,[
,]
,(
,)
,{
,}
,^
,$
如果需要将特殊字符作为普通字符使用,则必须使用反斜杠进行转义。
多次匹配某物
的名字 |
例子 |
描述 |
---|---|---|
任何 |
一个* |
*将匹配0个或多个前一个字符 |
至少有一个 |
+ |
+匹配至少一次重复的前一个字符 |
完全 |
一个 |
匹配前一个字符的确切数字 |
从, |
一个{x, y} |
匹配范围内前一个字符的数目。 |
到 |
一个{y} |
匹配前一个字符的限制 |
至少 |
一个{x} |
至少匹配前一个字符的限制 |
匹配字符集
的名字 |
例子 |
描述 |
---|---|---|
任何字符 |
. |
点匹配任何单个字符 |
任何数字 |
\ d |
匹配0-9的数字字符 |
任何空格 |
\ s |
匹配任何空白字符 |
只要不是数字 |
\ D |
匹配任何非数字的字符 |
只要不是空白 |
\ S |
匹配除空格外的任何字符 |
给定 |
(美国广播公司) |
匹配指定的任何字符 |
除了给定集合之外的任何集合 |
(^ abc) |
匹配除指定字符外的任何字符 |
正则表达式的旗帜
标志可以改变RegEx搜索的默认行为。它们在RegEx搜索的末尾,在斜杠“/”之后指定
- /i case-insensitive:不区分大小写,默认操作为区分大小写
- /m multiline:启用start(^)和end($)的特殊字符来匹配多行日志事件的单独行,默认操作是只匹配日志事件的开始和结束
- /s新行:启用特殊字符(.)匹配新行
- /U ungreedy:默认情况下RegEx是贪婪的,即搜索尝试匹配最大字符数。这导致搜索是不贪婪的,即它尝试匹配满足搜索参数的最少字符数
正则表达式的例子
InsightOps RegEx可以独立使用,也可以与任何搜索功能一起使用基本搜索文档提供先进的能力。RegEx搜索被放置在两个斜杠(" / ")中,可以包括可选的标志,如" i "。
的名字 |
描述 |
---|---|
/空/ |
包含Null的事件,例如NullPointerException |
/错误/我 |
包含错误的事件,不区分大小写,例如error, error |
/例外”。/ *” |
包含带有名称的异常跟踪的事件 |
/ 20 [01] / |
包含200或201的事件 |
ab * c |
匹配字符串ac, abc, abbc |
ab + c |
匹配字符串abc, abbc,但不匹配ac |
ab c {2} |
匹配abbc,但不匹配abc或abbbc。 |
ab {1,3} c |
匹配abc、abbc和abbbc |
ab c {2} |
匹配ac、abc、abbc |
ab c {2,} |
匹配abbc, abbbc,但不是abc |
交流 |
匹配字符串abc, acc, adc,但不匹配ac。 |
a \ d |
匹配a0 a1 a2 |
一个\某人 |
匹配一个b。 |
a \ D |
匹配字符串ab, ac,而不是a0 |
Sc的\ |
匹配字符串abc, a0c,但不匹配c |
/ /我完成 |
匹配字符串completed以及completed、completed和complete |
场= / regexp |
字段的值与正则表达式匹配 |
场!= /正则表达式/ |
字段的值与正则表达式不匹配 |
正则表达式字段提取
Regex分组和命名允许您在日志事件中标识值并为这些值指定名称,类似于在日志事件中使用Key值对。然后可以使用这个命名的捕获组执行更复杂的搜索功能。
好处
这使您能够识别日志中不采用键值格式的关键信息片段,以便将搜索功能应用于日志中的值。通过为标识的值指定名称,可以将这些值与高级搜索函数(如GroupBy())一起使用,或用于计算计数、总和、平均值或唯一实例计数等值。它们还可以用于创建警报时的比较。这意味着您可以创建一种非键值对日志格式的键值对类型。
- 对命名的捕获组使用标准的RE2正则表达式语法
- 不依赖于任何日志类型或结构
- 取消对数据采用KVP格式的要求
- 可以在查询中使用,并保存用于创建仪表板项。
名叫捕捉组
名为capture group的RegEx是通过在表达式中使用以下语法声明的:
1(? P <名称> regExp)
从' > '右侧的查询返回的结果将被赋值为' < > '中包含的名称。
考虑下面的示例日志事件,其中包含一个特定的值,如“total sale”:
112:12:14新销售活动-客户提姆-总销售额24.45 -商品毯212:12:15新销售活动-顾客提姆-总销售额100.45 -单品夹克3.12:12:16新销售活动-客户提姆-总销售额1000.33 -商品电脑
找到' total sale '后面的值并将该值赋给名为' salvalue '的命名变量的正则表达式是:
1(/总销售(? P < saleValue > \ d *) /)
一旦你捕获了密钥,你就可以对它执行所有的LEQL函数,例如:
1where(/总销售额(?P<销售额>\d*)/)计算(平均:销售额)
在示例中,' salvalue '是由于正则表达式而将分配' total sale '后面的数字的名称。一旦分配到saleValue,就可以对这些数字应用平均计算。
在这种情况下,正则表达式字段提取非常有用,因为值不是键值格式(KVP),这使得很难告诉大多数系统要使用什么值。通过使用Regex命名捕获组语法,现在很容易识别值并为其分配名称。然后将此名称用作搜索查询的一部分。还可以保存查询,然后使用它创建仪表板项。