使用正则表达式提取方括号中的字符串
Extract string in square bracket with regex
我在 splunk 中的日志如下:
[ A=xaxxxxx ] [ B=weea case ] [ C=another example 0 ]
如何只获取“=”后方括号中的字符串
像这样:xaxxxxx
; weea case
; another example 0
我的霸王龙是:rex field=_raw "(?<New_Field>\[\sC=(.*?)\s\])"
它提取所有内容,包括方括号[...]。
在 Splunk 中,只能使用命名的捕获组将数据提取到字段中。因此,正则表达式中的编号捕获组对 Splunk 没有任何意义。您需要在需要提取的模式部分周围使用 New_Field
组。
另外,你只匹配了C
,你可以用[A-Z]
匹配任何大写字母,如果有多个,则[A-Z]+
.
您可以使用
\[\s*[A-Z]+=\s*(?<New_Field>.*?)\s*]
见regex demo。 详情:
\[
- 一个[
字符\s*
- 零个或多个空格[A-Z]+
- 零个或多个大写 ASCII 字母=
- 一个=
字符\s*
- 零个或多个空格(?<New_Field>.*?)
- 组“New_Field”:除换行字符外的任何零个或多个字符尽可能少\s*
- 零个或多个空格]
- 一个]
字符。
您可以将不想捕获的内容移到组外:
\[\sC=(?<New_Field>[^\][]*)\s]
模式匹配:
\[\sC=
匹配[
空白字符和=
(?<New_Field>
命名组New_Field
[^\][]*
要留在方括号之间,可以使用否定字符 class)
关闭群组\s\]
匹配空白字符和]
看到一个regex demo.
要匹配 A、B 或 C,您可以使用字符 class:
\[\s[A-Z]=(?<New_Field>[^\][]*)\s]
再看一个regex demo。
这是一种更简单的方法 - 一种将在给定事件中 return all the matches 转换为多值字段的方法:
index=ndx sourcetype=srctp
| rex field=_raw max_match=0 "\[[^\[=]+\=(?<new_field>[^\]]+)"
从跳过左括号开始,等号之前的任何内容
那么等号后的所有内容都会匹配到右括号