我有一个大的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的实例,则可以找到起点和终点。但是,它们是单独的字段,因此无法在表格中清楚显示。这是regex命令,它将返回PurchaseCostTripSegment的第一个原点:
| rex max_match=0 "\<ns2\:numberCode\>(?P<location>[^\<]+)" | eval Segment1_Origin = mvindex(location, 7)
我需要一个正则表达式,它将返回PurchaseCostTripSegments的所有来源我试过了:
| rex max_match=0 "\<purchasedCostTripSegment\>*\<origin\>*\<ns2\:numberCode\>(?P<Origin>[^\<]+)"
它没有返回值。如何编写正则表达式以查找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>
在上述情况下,我想返回值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个或更多数字。