需要使用正则表达式命令在xml文件中查找值

问题描述 投票:0回答: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的实例,则可以找到起点和终点。但是,它们是单独的字段,因此无法在表格中清楚显示。这是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,

regex splunk
1个回答
0
投票

您可以将其用作临时解决方法:

| 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个或更多数字。
© www.soinside.com 2019 - 2024. All rights reserved.