需要正则表达式命令在 xml 文件中查找值
Need a regex command to find a value in an xml file
我在日志语句中有一个很大的 xml 文件。我正在使用 Splunk 从 xml 文件中提取值。我必须使用正则表达式来查找这些值,因为我无法更改配置文件。我要求更改,但它正在等待中...
这是 xml 文件的示例:
<?xml version="1.0" encoding="UTF-8"?>
<tmsTrip xmlns="http://ground.fedex.com/schemas/linehaul/trip" xmlns:ns2="http://ground.fedex.com/schemas/linehaul/TMSCommon">
<tripNumber>129271010</tripNumber>
<tripLegNumber>1</tripLegNumber>
<origin>
<ns2:numberCode>5902</ns2:numberCode>
...many more fields....
</origin>
<destination>
<ns2:numberCode>5087</ns2:numberCode>
...many more fields....
</destination>
...many more fields....
<purchasedCost>
<purchasedCostTripSegment>
<purchCostReference>2644025</purchCostReference>
<carrier>BNSF</carrier>
<vendorType>RAIL</vendorType>
<carrierTrailerType>53PC</carrierTrailerType>
<origin>
<ns2:numberCode>4022</ns2:numberCode>
...many more fields....
</origin>
<destination>
<ns2:numberCode>4040</ns2:numberCode>
...many more fields....
<stopOff>
<ns2:stopOffLocation>
<ns2:numberCode>9996</ns2:numberCode>
...many more fields....
</ns2:stopOffLocation>
</stopOff>
<schedDispatchDate>2020-05-27T05:00:00.000Z</schedDispatchDate>
...many more fields....
</purchasedCostTripSegment>
<purchasedCostTripSegment>
<purchCostReference>2644025</purchCostReference>
<carrier>NS</carrier>
<vendorType>RAIL</vendorType>
<carrierTrailerType>53PC</carrierTrailerType>
<origin>
<ns2:numberCode>4061</ns2:numberCode>
...many more fields....
</origin>
<destination>
<ns2:numberCode>4040</ns2:numberCode>
...many more fields....
</destination>
<stopOff>
<ns2:stopOffLocation>
<ns2:numberCode>4040</ns2:numberCode>
...many more fields....
</ns2:stopOffLocation>
</stopOff>
<schedDispatchDate>2020-05-27T05:00:00.000Z</schedDispatchDate>
...many more fields....
</purchasedCostTripSegment>
</purchasedCost>
</tmsTrip>
我需要为每个 purchasedCostTripSegment 确定出发地和目的地的 ns2:numberCode。
我在 Splunk 中执行此操作,因此正则表达式可能是 Splunk 特有的。
如果我使用函数 mvindex() 并计算 ns2:numberCode 的实例,我就能找到起点和终点。但它们是单独的字段,不会在 table 中清楚显示。
这是将 return PurchaseCostTripSegment 的第一个来源的正则表达式命令:
| rex max_match=0 "\<ns2\:numberCode\>(?P<location>[^\<]+)" | eval Segment1_Origin = mvindex(location, 7)
我需要一个正则表达式,它将 return PurchaseCostTripSegments 的所有来源
我试过这个:
| rex max_match=0 "\<purchasedCostTripSegment\>*\<origin\>*\<ns2\:numberCode\>(?P<Origin>[^\<]+)"
它 return 没有价值。
我如何编写正则表达式来查找 xml:
这一部分中的所有 ns2:numberCode 值
<purchasedCostTripSegment>
<purchCostReference>2644025</purchCostReference>
<carrier>BNSF</carrier>
<vendorType>RAIL</vendorType>
<carrierTrailerType>53PC</carrierTrailerType>
<origin>
<ns2:numberCode>4022</ns2:numberCode>
</purchasedCostTripSegment>
<purchasedCostTripSegment>
<purchCostReference>2644025</purchCostReference>
<carrier>NS</carrier>
<vendorType>RAIL</vendorType>
<carrierTrailerType>53PC</carrierTrailerType>
<origin>
<ns2:numberCode>4061</ns2:numberCode>
</purchasedCostTripSegment>
在上面的例子中,我想要 return 值,4022 和 4061,
您可以将其用作临时解决方法:
| rex max_match=0 "<purchasedCostTripSegment>[\s\S]*?<origin>\s*<ns2:numberCode>(?P<Origin>\d+)"
参见regex demo。
详情
<purchasedCostTripSegment>
- 一些文字
[\s\S]*?
- 零个或多个字符,尽可能少
<origin>
- 一些文字
\s*
- 0+ 个空白字符
<ns2:numberCode>
- 一些文字
(?P<Origin>\d+)
- 命名捕获组(对于 Splunk,它必须是一个命名组):1 个或多个数字。
我在日志语句中有一个很大的 xml 文件。我正在使用 Splunk 从 xml 文件中提取值。我必须使用正则表达式来查找这些值,因为我无法更改配置文件。我要求更改,但它正在等待中... 这是 xml 文件的示例:
<?xml version="1.0" encoding="UTF-8"?>
<tmsTrip xmlns="http://ground.fedex.com/schemas/linehaul/trip" xmlns:ns2="http://ground.fedex.com/schemas/linehaul/TMSCommon">
<tripNumber>129271010</tripNumber>
<tripLegNumber>1</tripLegNumber>
<origin>
<ns2:numberCode>5902</ns2:numberCode>
...many more fields....
</origin>
<destination>
<ns2:numberCode>5087</ns2:numberCode>
...many more fields....
</destination>
...many more fields....
<purchasedCost>
<purchasedCostTripSegment>
<purchCostReference>2644025</purchCostReference>
<carrier>BNSF</carrier>
<vendorType>RAIL</vendorType>
<carrierTrailerType>53PC</carrierTrailerType>
<origin>
<ns2:numberCode>4022</ns2:numberCode>
...many more fields....
</origin>
<destination>
<ns2:numberCode>4040</ns2:numberCode>
...many more fields....
<stopOff>
<ns2:stopOffLocation>
<ns2:numberCode>9996</ns2:numberCode>
...many more fields....
</ns2:stopOffLocation>
</stopOff>
<schedDispatchDate>2020-05-27T05:00:00.000Z</schedDispatchDate>
...many more fields....
</purchasedCostTripSegment>
<purchasedCostTripSegment>
<purchCostReference>2644025</purchCostReference>
<carrier>NS</carrier>
<vendorType>RAIL</vendorType>
<carrierTrailerType>53PC</carrierTrailerType>
<origin>
<ns2:numberCode>4061</ns2:numberCode>
...many more fields....
</origin>
<destination>
<ns2:numberCode>4040</ns2:numberCode>
...many more fields....
</destination>
<stopOff>
<ns2:stopOffLocation>
<ns2:numberCode>4040</ns2:numberCode>
...many more fields....
</ns2:stopOffLocation>
</stopOff>
<schedDispatchDate>2020-05-27T05:00:00.000Z</schedDispatchDate>
...many more fields....
</purchasedCostTripSegment>
</purchasedCost>
</tmsTrip>
我需要为每个 purchasedCostTripSegment 确定出发地和目的地的 ns2:numberCode。
我在 Splunk 中执行此操作,因此正则表达式可能是 Splunk 特有的。 如果我使用函数 mvindex() 并计算 ns2:numberCode 的实例,我就能找到起点和终点。但它们是单独的字段,不会在 table 中清楚显示。 这是将 return PurchaseCostTripSegment 的第一个来源的正则表达式命令:
| rex max_match=0 "\<ns2\:numberCode\>(?P<location>[^\<]+)" | eval Segment1_Origin = mvindex(location, 7)
我需要一个正则表达式,它将 return PurchaseCostTripSegments 的所有来源 我试过这个:
| rex max_match=0 "\<purchasedCostTripSegment\>*\<origin\>*\<ns2\:numberCode\>(?P<Origin>[^\<]+)"
它 return 没有价值。 我如何编写正则表达式来查找 xml:
这一部分中的所有 ns2:numberCode 值 <purchasedCostTripSegment>
<purchCostReference>2644025</purchCostReference>
<carrier>BNSF</carrier>
<vendorType>RAIL</vendorType>
<carrierTrailerType>53PC</carrierTrailerType>
<origin>
<ns2:numberCode>4022</ns2:numberCode>
</purchasedCostTripSegment>
<purchasedCostTripSegment>
<purchCostReference>2644025</purchCostReference>
<carrier>NS</carrier>
<vendorType>RAIL</vendorType>
<carrierTrailerType>53PC</carrierTrailerType>
<origin>
<ns2:numberCode>4061</ns2:numberCode>
</purchasedCostTripSegment>
在上面的例子中,我想要 return 值,4022 和 4061,
您可以将其用作临时解决方法:
| rex max_match=0 "<purchasedCostTripSegment>[\s\S]*?<origin>\s*<ns2:numberCode>(?P<Origin>\d+)"
参见regex demo。
详情
<purchasedCostTripSegment>
- 一些文字[\s\S]*?
- 零个或多个字符,尽可能少<origin>
- 一些文字\s*
- 0+ 个空白字符<ns2:numberCode>
- 一些文字(?P<Origin>\d+)
- 命名捕获组(对于 Splunk,它必须是一个命名组):1 个或多个数字。