Sed
如何從日誌文件中提取 XML
我在下面有這個日誌文件,我想通過使用一個欄位作為輸入搜尋來提取其中的 XML
<ns12:equipmentId>089471386301077634</ns12:equipmentId>
,所以腳本應該在日誌文件中進行搜尋089471386301077634
並返回整個 XML<ns1:queryDeviceInfoBtRequest...
直到</ns1:queryDeviceInfoBtRequest>
,任何想法怎麼做?... .. . 2016/11/09 07:29:18 Request: mqMessage: MQMD:[queue=EKS01A2T/EKS.QUERYDEVICEINFO,applicationOriginData= ,format=MQSTR ,backoutCount=0,characterSet=1208,correlationId=000000000000000000000000000000000000000000000000,encoding=273,expiry=500,messageId=414D51204450303141325420202020205788160022E00ACA,persistence=0,putApplicationName=WebSphere Datapower MQClient,putDateTime=2016-10-9T12:29:18.490-GMT,replyToQueueManagerName=DP01A2T ,replyToQueueName=76S.REPLY16 ,userId=null] Data:[<?xml version="1.0" encoding="UTF-8"?> <ns1:queryDeviceInfoBtRequest xmlns:ns1="http://integration.sprint.com/integration/interfaces/queryDeviceInfoBtV1/v1/queryDeviceInfoBtV1"> <ns3:mqMessageHeader xmlns:ns3="http://integration.sprint.com/public/interfaces/MQMessageHeaderV2.xsd"> <ns3:messageHeaderVersion>2</ns3:messageHeaderVersion> <ns3:serviceName>queryDeviceInfoBt</ns3:serviceName> <ns3:serviceQualifier>76S</ns3:serviceQualifier> <ns3:serviceVersion>1</ns3:serviceVersion> <ns3:dialogTypeCode>2</ns3:dialogTypeCode> <ns3:dialogSubTypeCode>1</ns3:dialogSubTypeCode> <ns3:parentDialogReference>7V2-CONVID-aab02e21</ns3:parentDialogReference> <ns3:dialogReference>7V2-MSGID-SP-aab02e21</ns3:dialogReference> <ns3:applicationReference>7V2</ns3:applicationReference> <ns3:applicationGroup>7V2</ns3:applicationGroup> <ns3:componentGroup>Equipment</ns3:componentGroup> <ns3:componentName>queryDeviceInfoBt</ns3:componentName> <ns3:reqSentDateTime>2016-11-09T07:29:18.003-05:00</ns3:reqSentDateTime> <ns3:applicationUserId>7V2</ns3:applicationUserId></ns3:mqMessageHeader> <data xmlns="http://integration.sprint.com/integration/interfaces/queryDeviceInfoBtV1/v1/queryDeviceInfoBtV1"> <ns12:queryDeviceInfo xmlns="http://integration.sprint.com/interfaces/validateDevice/v8/validateDeviceV8.xsd" xmlns:ns2="http://integration.sprint.com/common/header/WSMessageHeader/v2" xmlns:ns3="http://integration.sprint.com/common/ErrorDetailsV2.xsd" xmlns:ns4="http://integration.sprint.com/interfaces/queryDeviceResourceInfo/v1/queryDeviceResourceInfo.xsd" xmlns:ns5="http://integration.sprint.com/interfaces/queryCdmaDeviceInfo/v2/queryCdmaDeviceInfoV2.xsd" xmlns:ns6="http://integration.sprint.com/interfaces/queryAccountDeviceList/v1/queryAccountDeviceList.xsd" xmlns:ns7="http://integration.sprint.com/interfaces/queryDeviceCapabilities/v2/queryDeviceCapabilitiesV2.xsd" xmlns:ns8="http://integration.sprint.com/interfaces/validateGiveBackDevice/v1/validateGiveBackDevice.xsd" xmlns:ns9="http://integration.sprint.com/interfaces/queryDeviceResourceInfo/v2/queryDeviceResourceInfoV2.xsd" xmlns:ns10="http://integration.sprint.com/interfaces/validateDevice/v7/validateDeviceV7.xsd" xmlns:ns11="http://integration.sprint.com/interfaces/queryDeviceList/v1/queryDeviceList.xsd" xmlns:ns13="http://integration.sprint.com/interfaces/queryDeviceHistoryByResource/v1/queryDeviceHistoryByResource.xsd" xmlns:ns14="http://integration.sprint.com/interfaces/querySubscriberDeviceList/v1/querySubscriberDeviceList.xsd" xmlns:ns15="http://integration.sprint.com/interfaces/queryDeviceCatalogInfo/v1/queryDeviceCatalogInfo.xsd" xmlns:ns16="http://integration.sprint.com/interfaces/validateDevice/v6/validateDeviceV6.xsd" xmlns:ns17="http://integration.sprint.com/interfaces/queryDeviceOrderHistory/v1/queryDeviceOrderHistory.xsd" xmlns:ns18="http://integration.sprint.com/interfaces/validateBuybackDevice/v1/validateBuybackDevice.xsd" xmlns:ns19="http://integration.sprint.com/interfaces/validateDevice/v9/validateDeviceV9.xsd" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns12="http://integration.sprint.com/interfaces/queryDeviceInfo/v1/queryDeviceInfo.xsd"> <ns12:info> <ns12:equipmentId>089471386301077634</ns12:equipmentId> <ns12:checkPreviouslyActivated>true</ns12:checkPreviouslyActivated> <ns12:brandCode>BST</ns12:brandCode></ns12:info></ns12:queryDeviceInfo></data></ns1:queryDeviceInfoBtRequest>] 2016/11/09 07:29:18 OutputQMgr/OutputQueue:[null/EKS.VALDVC] MQPutMessage: MQMD:[applicationOriginData= ,backoutCount=0,characterSet=819,correlationId=000000000000000000000000000000000000000000000000,encoding=273,expiry=500,messageId=414D5120454B53303141325420202020C54617580FB08F20,persistence=2,putApplicationName=java ,putDateTime=2016-10-9T12:29:18.510-GMT,replyToQueueManagerName= ,replyToQueueName=EKS.REPLY03 ,userId=eaiowner ] Data:[1VALDVCBT 3 10 00000_EKS EKS eksSystem 00000000 089471386301077634 BST] 2016/11/09 07:29:18 MQGetMessage: MQMD:[applicationOriginData= ,backoutCount=0,characterSet=819,correlationId=414D5120454B53303141325420202020C54617580FB08F20,encoding=273,expiry=500,messageId=414D5120454B53303141325420202020C54617580FB08F20,persistence=0,putApplicationName=java ,putDateTime=2016-10-9T12:29:18.520-GMT,replyToQueueManagerName=EKS01A2T ,replyToQueueName=EKS.REPLY03 ,userId=eaiowner ] Data:[4VALDVCBT_R 3 10 00000 EKS eksSystem 00000000010 Device is valid and cleared for use APPLE, INC IPH 6 GRAY 16 BST BOX SGL CG885909950249 35544007107182U0 SUCCESS CO I ] 2016/11/09 07:29:18 Select rtrim(id.item_id), trim(id.serial_type), trim(id.item_ldesc), trim(id.item_sdesc), trim(id.item_ldesc), trim(id.manf_cd), trim(id.network_ind), trim(id.used_eqp), trim(sii.pool), trim(sii.location_id), trim(sii.activity_code), to_char(sii.activity_date, 'mmddyyyy'), trim(sii.item_ownership),rtrim(sii.curr_possession), trim(sii.missing_ind), trim(sii.in_repair_ind), trim(sii.in_transit_ind), trim(sii.comited_to_pos_ind), trim(sii.software_ver),rtrim(sii.SERIAL_NUMBER),trim(item_id_type) FROM serial_item_inv sii, item_definition id WHERE sii.serial_number= ? AND sii.item_id = id.item_id {[0]089471386301077634} jdbc:eaidb:dbpool [ com.sprint.eai.queryDeviceinfo.dao.QueryDeviceInfoDao : getEquipmentDetails ] Elapsed time (ms) =1 2016/11/09 07:29:18 select TRIM(manf_cd), TRIM(item_ldesc), TRIM(item_id_type) from item_definition where item_id = rpad(:mdlNbr,15) AND ROWNUM < 2 {[0]885909950249} jdbc:eaidb:dbpool [ com.sprint.eai.queryDeviceinfo.dao.QueryDeviceInfoDao : getManufacturerInfo ] Elapsed time (ms) =1 2016/11/09 07:29:18 SELECT ea.ATTR_CODE FROM EQUIPMENT_ATTR ea, ITEM_DEFINITION id WHERE id.ITEM_ID = ea.ITEM_ID AND id.ITEM_ID = rpad(?,15) {[0]885909950249} jdbc:eaidb:dbpool [ com.sprint.eai.queryDeviceinfo.dao.QueryDeviceInfoDao : getDeviceDetailInfo ] Elapsed time (ms) =1 2016/11/09 07:29:18 select case when count(*) > 0 THEN 'true' else 'false' end from EQP_RULE_LINK where item_id = RPAD(:item_id, 15) and group_id in('MF','MT','MC','MB','M4') {[0]885909950249} jdbc:eaidb:dbpool [ com.sprint.eai.queryDeviceinfo.dao.QueryDeviceInfoDao : getDeviceDetailInfo ] Elapsed time (ms) =0 2016/11/09 07:29:18 SELECT DISC_AMT from EQUIP_AGR_GEN_ATTR WHERE ATTR_CODE= 'DISCELG' {} jdbc:eaidb:dbpool [ com.sprint.eai.queryDeviceinfo.dao.QueryDeviceInfoDao : getDeviceDetailInfo ] Elapsed time (ms) =1 2016/11/09 07:29:18 select TRIM(MODEL_NME) from device_info where wrls_dev_sku_nbr = TRIM(:item_id) {[0]885909950249} jdbc:eaidb:dbpool [ com.sprint.eai.queryDeviceinfo.dao.QueryDeviceInfoDao : getMarketingName ] Elapsed time (ms) =1 2016/11/09 07:29:18 SELECT decode(sa.cross_fleet_ind, 'Y', 'true', 'N','false', 'false') , decode(sa.dc_ind, 'Y', 'true', 'N','false', 'false') , decode(sa.cell_ind, 'Y', 'true', 'N','false', 'false') , decode(sa.pds_ind, 'Y', 'true', 'N','false', 'false') , decode(sa.mms_ind, 'Y', 'true', 'N','false', 'false') , decode(sa.sdgc_ind, 'Y', 'true', 'N','false', 'false') , decode(sa.gprs_ind, 'Y', 'true', 'N','false', 'false') , decode(sa.ext800_ind, 'Y', 'true', 'N','false', 'false') , decode(sa.ptt_ind, 'Y', 'true', 'N','false', 'false') FROM software_attr sa WHERE sa.item_id=rpad(:itemId, 15) AND (:phoneSoftware is null or sa.software_ver = :phoneSoftware) {[0]885909950249,[1]null,[2]null} jdbc:eaidb:dbpool [ com.sprint.eai.queryDeviceinfo.dao.QueryDeviceInfoDao : getPhoneSoftwareInfo ] Elapsed time (ms) =0 2016/11/09 07:29:18 SELECT ea.ATTR_CODE FROM EQUIPMENT_ATTR ea, ITEM_DEFINITION id WHERE id.ITEM_ID = ea.ITEM_ID AND id.ITEM_ID = rpad(?,15) {[0]885909950249} jdbc:eaidb:dbpool [ com.sprint.eai.queryDeviceinfo.dao.QueryDeviceInfoDao : getEquipAttrCode ] Elapsed time (ms) =1 2016/11/09 07:29:18 OutputQMgr/OutputQueue:[null/EKS.REQDVCHIST] MQPutMessage: MQMD:[applicationOriginData= ,backoutCount=0,characterSet=819,correlationId=000000000000000000000000000000000000000000000000,encoding=273,expiry=500,messageId=414D5120454B53303141325420202020C546175810B08F20,persistence=2,putApplicationName=java ,putDateTime=2016-10-9T12:29:18.540-GMT,replyToQueueManagerName= ,replyToQueueName=EKS.REPLY03 ,userId=eaiowner ] Data:[1REQDVCHISTBT 3 2 00000_EKS EKS eksSystem 00000000 089471386301077634E1 ] 2016/11/09 07:29:18 MQGetMessage: MQMD:[applicationOriginData= ,backoutCount=0,characterSet=819,correlationId=414D5120454B53303141325420202020C546175810B08F20,encoding=273,expiry=500,messageId=414D5120454B53303141325420202020C546175855AB8F20,persistence=0,putApplicationName=java ,putDateTime=2016-10-9T12:29:18.560-GMT,replyToQueueManagerName=EKS01A2T ,replyToQueueName=EKS.REPLY03 ,userId=eaiowner ] Data:[4REQDVCHISTBT_R 3 2 00000 EKS eksSystem 200000001NMS REQDVCHISTBT REQDVCHISTBT nms_exception 00000115Server.704:NMS returned status_code=38, status_text=DOES_NOT_EXIST_IN_DB: No records found in SubscriberLinkHistory] 2016/11/09 07:29:18 Response: mqMessage: MQMD:[applicationOriginData= ,format=MQSTR ,backoutCount=0,characterSet=1208,correlationId=414D51204450303141325420202020205788160022E00ACA,encoding=273,expiry=500,messageId=,persistence=0,putApplicationName=WebSphere Datapower MQClient,putDateTime=null,replyToQueueManagerName=DP01A2T ,replyToQueueName=76S.REPLY16 ,userId=null] Data:[<?xml version="1.0" encoding="UTF-8"?> <quer:queryDeviceInfoBtResponse xmlns:quer="http://integration.sprint.com/integration/interfaces/queryDeviceInfoBtV1/v1/queryDeviceInfoBtV1" xmlns:quer1="http://integration.sprint.com/interfaces/queryDeviceInfo/v1/queryDeviceInfo.xsd"> <ns3:mqMessageHeader xmlns:ns3="http://integration.sprint.com/public/interfaces/MQMessageHeaderV2.xsd"> <ns3:messageHeaderVersion>2</ns3:messageHeaderVersion> <ns3:serviceName>queryDeviceInfoBt</ns3:serviceName> <ns3:serviceQualifier>76S</ns3:serviceQualifier> <ns3:serviceVersion>1</ns3:serviceVersion> <ns3:dialogTypeCode>2</ns3:dialogTypeCode> <ns3:dialogSubTypeCode>4</ns3:dialogSubTypeCode> <ns3:parentDialogReference>7V2-CONVID-aab02e21</ns3:parentDialogReference> <ns3:dialogReference>7V2-MSGID-SP-aab02e21</ns3:dialogReference> <ns3:applicationReference>7V2</ns3:applicationReference> <ns3:applicationGroup>7V2</ns3:applicationGroup> <ns3:componentGroup>Equipment</ns3:componentGroup> <ns3:componentName>queryDeviceInfoBt</ns3:componentName> <ns3:reqSentDateTime>2016-11-09T07:29:18.003-05:00</ns3:reqSentDateTime> <ns3:applicationUserId>7V2</ns3:applicationUserId> <ns3:replyCompletionCode>0</ns3:replyCompletionCode> </ns3:mqMessageHeader> <quer:data> <quer1:queryDeviceInfoResponse> <quer1:equipmentInfo> <quer1:equipmentId>089471386301077634</quer1:equipmentId> <quer1:itemId>885909950249</quer1:itemId> <quer1:serialType>E</quer1:serialType> <quer1:esn>089471386301077634</quer1:esn> <quer1:esnHex>35544007107182</quer1:esnHex> <quer1:description>IPH 6 GRAY 16 BST BOX SGL</quer1:description> <quer1:manufacturer>436</quer1:manufacturer> <quer1:modelNumber>885909950249</quer1:modelNumber> <quer1:phoneModel>IPH 6 GRAY 16 BST BOX SGL</quer1:phoneModel> <quer1:possession>A</quer1:possession> <quer1:negativeInd>false</quer1:negativeInd> <quer1:cellInd>true</quer1:cellInd> <quer1:pdsInd>true</quer1:pdsInd> <quer1:pttInd>false</quer1:pttInd> <quer1:networkInd>C</quer1:networkInd> <quer1:pamInd>true</quer1:pamInd> <quer1:hppttInd>false</quer1:hppttInd> <quer1:evdoInd>true</quer1:evdoInd> <quer1:abGlmsInd>false</quer1:abGlmsInd> <quer1:previouslyActivated>N</quer1:previouslyActivated> <quer1:equipmentStatus>D</quer1:equipmentStatus> <quer1:inputSerialType>E</quer1:inputSerialType> <quer1:wiMaxInd>false</quer1:wiMaxInd> <quer1:lteInd>true</quer1:lteInd> <quer1:lteUiccType>U</quer1:lteUiccType> <quer1:iccId/> <quer1:uiccStatus/> <quer1:isBroadband2GoInd>false</quer1:isBroadband2GoInd> <quer1:isBlackberryDeviceInd>false</quer1:isBlackberryDeviceInd> <quer1:isDeviceInsuranceEligibleInd>Y</quer1:isDeviceInsuranceEligibleInd> <quer1:isAppleInsuranceApplicableInd>N</quer1:isAppleInsuranceApplicableInd> <quer1:isDeviceMRCDiscountEligibleInd>true</quer1:isDeviceMRCDiscountEligibleInd> <quer1:mrcDiscountAmount>5</quer1:mrcDiscountAmount> <quer1:marketingName>Boost iPhone 6 16GB</quer1:marketingName> </quer1:equipmentInfo> </quer1:queryDeviceInfoResponse> </quer:data> </quer:queryDeviceInfoBtResponse>] . .. ...
sed -rn ' /<ns1:queryDeviceInfoBtRequest/!b h :X n /<\/ns1:queryDeviceInfoBtRequest>/ { H;g />089471386301077634</p b } H bX ' xmlfile
是的,這實際上很容易。您的 XML 似乎開始和
Data:[
結束於]\n\n
唯一的問題是如果 XML 中有括號,它會變得有點尷尬。
反正:
#!/usr/bin/env perl use strict; use warnings; use XML::Twig; #hardcoded. But could read this from the command line with #e.g. shift @ARGV #this will 'take' the first argument, but leave any others (e.g. filenames to read) my $search_id = '089471386301077634'; #set record separator local $/ = ">]\n"; #iterate the 'magic' filehandle. # <> is either STDIN or files specified as args, just like "grep" while ( <> ) { #match Data followed by XML header. Multi-line my ( $xml ) = m/Data:\[(\<\?xml[^]]+)/gms; #if no match (e.g. not XML ) then skip next unless $xml; #parse it - pick up any errors (XML parse errors should be fatal #hence the eval my $twig = eval { XML::Twig -> parse ( $xml ); }; if ($@) {warn "XML blob couldn't be parsed $@\n"}; #set output formatting. (optional) $twig -> set_pretty_print('indented_a'); #print it to STDOUT. #but test if the 'equipment ID' is as required first: if ( $twig -> findnodes("//ns12:equipmentId[string()=\"$search_id\"]") ) { print "Found: \n"; $twig -> findnodes("//ns12:equipmentId[string()=\"$search_id\"]",0) -> print; print "\nFull XML:\n"; $twig -> set_pretty_print('indented_a'); $twig -> print; } }