td-agent 中的可选正则表达式模式
optional regex patten in td-agent
我有两种不同格式的日志行,你可以用这个做测试site
我需要在下面的行中保留可选的 client 部分,如果它存在它就会得出结论,否则它会忽略
\[(?<date>[^\]]*)\] \[(?<level>[^\]]*)\] \[(?<pid-tid>[^\]]*)\] (\[(?<client>[^\]]*)\]) (?<message>[^\]]*)
日志行 - 没有客户端
[1 月 18 日星期一 21:55:58.239970 2016] [proxy_http:错误] [pid 2769:tid 140041068427008] AH01114:HTTP:无法连接到后端:xx.xxx.xx.xx
日志行 - 与客户端
[1 月 18 日星期一 21:55:58.239970 2016] [proxy_http:错误] [pid 2769:tid 140041068427008] [客户端 xx.xxx.x.xx:10723] AH01114: HTTP:无法连接到后端:xx.xxx.xx.xx
我试过 (.*?clientsection) -> 0 个或更多匹配项
\[(?<date>[^\]]*)\] \[(?<level>[^\]]*)\] \[(?<pid-tid>[^\]]*)\] (.*?(\[(?<client>[^\]]*)\])) (?<message>[^\]]*)
但是没用
在你的第二个表达式中, (.*?(\[(?<client>[^\]]*)\]))
部分匹配一个必需的 space,然后捕获任何 0+ 个字符,尽可能少,然后捕获除 ]
以外的 0+ 个字符进入 "client" 组,然后匹配 ]
将其放入编号的捕获组中。如果文本中缺少客户端部分,您的表达式将尝试匹配第一个 space,然后是 [...]
子字符串,最后是 space。
如果您想修复正则表达式,您需要使 "client" 组成为可选的 并确保相邻的上下文也成为可选的。
将 (.*?(\[(?<client>[^\]]*)\]))
替换为 (?: \[(?<client>[^\]]*)\])?
。这里,(?:...)?
是一个可选的非捕获组,它将不创建子组(不捕获),并且将匹配其模式的 1 次或 0 次出现,前提是所有序列都存在。
参见Rubular demo(\n
被添加到否定字符类,因为多行字符串用于测试)。
我有两种不同格式的日志行,你可以用这个做测试site
我需要在下面的行中保留可选的 client 部分,如果它存在它就会得出结论,否则它会忽略
\[(?<date>[^\]]*)\] \[(?<level>[^\]]*)\] \[(?<pid-tid>[^\]]*)\] (\[(?<client>[^\]]*)\]) (?<message>[^\]]*)
日志行 - 没有客户端
[1 月 18 日星期一 21:55:58.239970 2016] [proxy_http:错误] [pid 2769:tid 140041068427008] AH01114:HTTP:无法连接到后端:xx.xxx.xx.xx
日志行 - 与客户端
[1 月 18 日星期一 21:55:58.239970 2016] [proxy_http:错误] [pid 2769:tid 140041068427008] [客户端 xx.xxx.x.xx:10723] AH01114: HTTP:无法连接到后端:xx.xxx.xx.xx
我试过 (.*?clientsection) -> 0 个或更多匹配项
\[(?<date>[^\]]*)\] \[(?<level>[^\]]*)\] \[(?<pid-tid>[^\]]*)\] (.*?(\[(?<client>[^\]]*)\])) (?<message>[^\]]*)
但是没用
在你的第二个表达式中, (.*?(\[(?<client>[^\]]*)\]))
部分匹配一个必需的 space,然后捕获任何 0+ 个字符,尽可能少,然后捕获除 ]
以外的 0+ 个字符进入 "client" 组,然后匹配 ]
将其放入编号的捕获组中。如果文本中缺少客户端部分,您的表达式将尝试匹配第一个 space,然后是 [...]
子字符串,最后是 space。
如果您想修复正则表达式,您需要使 "client" 组成为可选的 并确保相邻的上下文也成为可选的。
将 (.*?(\[(?<client>[^\]]*)\]))
替换为 (?: \[(?<client>[^\]]*)\])?
。这里,(?:...)?
是一个可选的非捕获组,它将不创建子组(不捕获),并且将匹配其模式的 1 次或 0 次出现,前提是所有序列都存在。
参见Rubular demo(\n
被添加到否定字符类,因为多行字符串用于测试)。