regex语句,以满足日志文件中可以包含空白值或数字值的字段

sczxawaw  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(322)

我在配置单元查询的create表中遇到input.regex语句问题,该语句导致一个字段中的部分数据被部分填充到另一个字段中。
日志文件包含一个请求和一个应答事务,但在应答事务中,有一个名为heartbeat的列,其中包含请求事务中不存在的以毫秒为单位的时间戳。hearbeat数据可以包含一个带有小数位的时间戳,有时为零,例如“31.2498ms”或“0ms”,这是我在regex中需要的。
问题是它不处理不包含心跳的请求事务,并且在数据中,它不包含心跳所在的额外空间,因此regex从sessionkey字段获取前几个值并将其填充到心跳中。
因此,预期的结果是heartbeat字段不包含所有请求事务的数据,sessionkey数据保持不变。
我在下面包含了regex和数据示例以及rebular的屏幕截图,这些截图以黄色突出显示了问题。
正则表达式

(^[0-9]*) ([0-9]*) ([0-9]*) ([0-9]*) ([0-9]*) ([^ ]*) ([^ ]*)   ([^ ]*)   ([0-9]* [0-9]* [0-9]*) ([^ ]*)(?:[:]) ([0-9]+.[0-9]+|[0-9]|)(?:ms |)([^ ]*)(?:[:])(.*$)

结构

Version = 0 
EventTime = 20140625095038615 
LogTime = 20140625095038646 
SequenceNumber = 0000 
Level = 006 
InternalArea = 00/0000/000 
MachineName = LSEMPPRD  
ApplicationName = Nestra   
DiscardedMessageCount = 000 000000 00 
TranType = Reply: 
Heartbeat = 296.4057ms 
SessionKey = d594891a-6d9c-4b5c-913a-9dc302277534:
Message = <GetInfo xmlns="http://tempuri.org/"><terminalSession xmlns:b="

交易类型示例

0 20140622104758792 20140622104758792 0000 006 00/0000/000 LSEMPPRD   Nestra   000 000000 00 Request: 5a0a48b9-8b7d-4174-bdd5-55673affb825: <GetInfo xmlns="http://tempuri.org/"><terminalSession xmlns:b="http://schemas.datacontract.org/2004/07/ApplicationServices.DataContracts.Common" <b:SessionKey>17789cc9-6bc8-4c4b-85d2-b86b21af0fb3</b:SessionKey></terminalSession></GetInfo>
0 20140622104758792 20140622104758792 0000 006 00/0000/000 LSEMPPRD   Nestra   000 000000 00 Reply: 0ms 5a0a48b9-8b7d-4174-bdd5-55673affb825: <GetInfo xmlns="http://tempuri.org/"><GetInfoResult xmlns:b="http://schemas.datacontract.org/2004/07/ApplicationServices.DataContracts.Responses" </GetInfoResult></GetInfoResponse>
0 20140622104758792 20140622104758792 0000 006 00/0000/000 LSEMPPRD   Nestra   000 000000 00 Reply: 31.2498ms 5a0a48b9-8b7d-4174-bdd5-55673affb825: <GetInfo xmlns="http://tempuri.org/"><GetInfoResult xmlns:b="http://schemas.datacontract.org/2004/07/ApplicationServices.DataContracts.Responses" </GetInfoResult></GetInfoResponse>


oo7oh9g9

oo7oh9g91#

完成正则表达式:(小心地注意空格)

(^[0-9]*) ([0-9]*) ([0-9]*) ([0-9]*) ([0-9]*) ([^ ]*) ([^ ]*)   ([^ ]*)   ([0-9]*) ([0-9]*) ([0-9]*) ([^ ]*)(?:[:])([ \d*\.?\d+]+(?=ms)|)(?:ms|) ([^ ]*)(?:[:])(.*$)

验证:
输入:

输出:1号线

第2行

第3行

wlp8pajw

wlp8pajw2#

看起来像是 Reply: 以及 Request: 字段总是出现在这些日志事务中(一个或另一个)。可以在正则表达式中使用 | 或语法的运算符:

(^[0-9]*) ([0-9]*) ([0-9]*) ([0-9]*) ([0-9]*) ([^ ]*) ([^ ]*)   ([^ ]*)   ([0-9]* [0-9]* [0-9]*) (((Reply): ([0-9]+.[0-9]+|[0-9]|)(?:ms |))|(Request): )([^ ]*)(?:[:])(.*$)

我使用regexhero(有许多在线测试人员)在您的示例数据上测试了上述内容。它显示了replace表达式的以下输出 $12, $13, $14, $15 指的是捕获的组号:

, , Request, 5a0a48b9-8b7d-4174-bdd5-55673affb825
Reply, 0, , 5a0a48b9-8b7d-4174-bdd5-55673affb825
Reply, 31.2498, , 5a0a48b9-8b7d-4174-bdd5-55673affb825

所以,如果捕获组$12是“回复”,那么您知道字段 Heartbeat 在组$13中,否则该记录是请求事务。

ryevplcw

ryevplcw3#

更新的输入行:(4)

0 20140622104758792 20140622104758792 0000 006 00/0000/000 LSEMPPRD   Nestra   000 000000 00 Request: 5a0a48b9-8b7d-4174-bdd5-55673affb825: <GetInfo xmlns="http://tempuri.org/"><terminalSession xmlns:b="http://schemas.datacontract.org/2004/07/ApplicationServices.DataContracts.Common" <b:SessionKey>17789cc9-6bc8-4c4b-85d2-b86b21af0fb3</b:SessionKey></terminalSession></GetInfo>
0 20140622104758792 20140622104758792 0000 006 00/0000/000 LSEMPPRD   Nestra   000 000000 00 Reply: 0ms 5a0a48b9-8b7d-4174-bdd5-55673affb825: <GetInfo xmlns="http://tempuri.org/"><GetInfoResult xmlns:b="http://schemas.datacontract.org/2004/07/ApplicationServices.DataContracts.Responses" </GetInfoResult></GetInfoResponse>
0 20140622104758792 20140622104758792 0000 006 00/0000/000 LSEMPPRD   Nestra   000 000000 00 Reply: 31.2498ms 5a0a48b9-8b7d-4174-bdd5-55673affb825: <GetInfo xmlns="http://tempuri.org/"><GetInfoResult xmlns:b="http://schemas.datacontract.org/2004/07/ApplicationServices.DataContracts.Responses" </GetInfoResult></GetInfoResponse>
0 20140621102140946 20140621102140946 0000 008 00/0000/000 LSEMPPRD   Nestra   000 000000 00 NesHost: Hello has stopped failing (after 1 failures).

单个regex可以处理以上4种类型的日志:

(^[0-9]*) ([0-9]*) ([0-9]*) ([0-9]*) ([0-9]*) ([^ ]*) ([^ ]*)   ([^ ]*)   ([0-9]*) ([0-9]*) ([0-9]*) ([^ ]*)(?:[:])([ \d*\.?\d+]+(?=ms)|)(?:ms|) ([^ ]+(?=\:)|)(?:\:|)(.*$)

验证@http://rubular.com/:(1、2、3号线见以上ans)4号线卡扣

相关问题