#!/usr/bin/perl -w use strict; while () { print "\n$_" if m/CME20CP6.CallDataRecord/; next if /^\s*\[/; #skip stuff like [1] : '011351'H print "$1 : $2\n" if m/^\s*(\S+)\s+:\s+(\S+)\s*$/; } #Prints: #CME20CP6.CallDataRecord.uMTSGSMPLMNCallDataRecord #callIdentificationNumber : '6CBFD7'H #exchangeIdentity : "DWLCCN6" #gSMCallReferenceNumber : '9103770001'H #switchIdentity : '0001'H #recordSequenceNumber : '39D42E'H #date : '1409071F'H #serviceFeatureCode : '0002'H #timeForEvent : '131A01'H #CME20CP6.CallDataRecord.uMTSGSMPLMNCallDataRecord #callIdentificationNumber : '6CC99C'H #exchangeIdentity : "DWLCCN6" #switchIdentity : '0001'H #recordSequenceNumber : '39D42F'H #date : '1409071F'H #serviceFeatureCode : '0002'H #timeForEvent : '131A20'H #note fiddle with regex to suit you needs #change to say print "$1 : $2\n" if m/^\s*(\S+)\s+:\s+(.*)\s*$/; #if you want say #chargePartySingle : 'aPartyToBeCharged (0)' to appear __DATA__ CME20CP6.CallDataRecord.uMTSGSMPLMNCallDataRecord { sCFChargingOutput { callIdentificationNumber : '6CBFD7'H exchangeIdentity : "DWLCCN6" gSMCallReferenceNumber : '9103770001'H switchIdentity : '0001'H recordSequenceNumber : '39D42E'H date : '1409071F'H } eventModule { iNServiceDataEventModule { chargePartySingle : 'aPartyToBeCharged (0)' genericChargingDigits { [0] : '2000'H [1] : '011351'H [2] : '223A941400'H [3] : '233A940209'H [4] : '043A2000'H [5] : '0542'H [6] : '2600'H [7] : '2700'H [8] : '080290701391620122'H [9] : '2A02'H [10] : '72000000000000000000000000'H [11] : '730000000000000000041F'H [12] : '7400000000'H [13] : '3502'H } genericChargingNumbers { [0] : '0003136985138324'H [1] : '010413198935930920'H [2] : '0203136985138324'H [3] : '038290905893701402'H [4] : '0B000002000000'H } serviceFeatureCode : '0002'H timeForEvent : '131A01'H } } } CME20CP6.CallDataRecord.uMTSGSMPLMNCallDataRecord { sCFChargingOutput { callIdentificationNumber : '6CC99C'H exchangeIdentity : "DWLCCN6" switchIdentity : '0001'H recordSequenceNumber : '39D42F'H date : '1409071F'H } eventModule { iNServiceDataEventModule { chargePartySingle : 'bPartyToBeCharged (1)' genericChargingDigits { [0] : '2002'H [1] : '010359'H [2] : '023A8207'H [3] : '033A8207'H [4] : '043A0000'H [5] : '0506'H [6] : '2600'H [7] : '2704'H [8] : '080290701391622322'H [9] : '2A02'H [10] : '72000000000000000000000000'H [11] : '730000000000000000001F'H [12] : '3500'H } genericChargingNumbers { [0] : '0003138935167173'H [1] : '028210850000'H [2] : '0303138935167173'H [3] : '06041319'H } serviceFeatureCode : '0002'H timeForEvent : '131A20'H } } } #### #!/usr/bin/perl -w use strict; my @csv_order = qw ( exchangeIdentity callIdentificationNumber); my %defaults = map {$_ => ""}@csv_order; my %curr_record=%defaults; while () { if (/CME20CP6.CallDataRecord/.../^\s*$/) { if ( my ($var,$val) = ($_ =~ m/^\s*(\S+)\s+:\s+(\S+)\s*$/) ) { $curr_record{$var}=$val if exists ($curr_record{$var}); } if (/^\s*$/) #remember to add a blank line at end of file { dump_csv_line(); %curr_record=%defaults; } } } sub dump_csv_line { print join (",",map{$curr_record{$_}}@csv_order)."\n"; } __END__ Prints: "DWLCCN6",'6CBFD7'H "DWLCCN6",'6CC99C'H ,'699999'H __DATA__ CME20CP6.CallDataRecord.uMTSGSMPLMNCallDataRecord callIdentificationNumber : '6CBFD7'H exchangeIdentity : "DWLCCN6" gSMCallReferenceNumber : '9103770001'H switchIdentity : '0001'H recordSequenceNumber : '39D42E'H date : '1409071F'H serviceFeatureCode : '0002'H timeForEvent : '131A01'H CME20CP6.CallDataRecord.uMTSGSMPLMNCallDataRecord callIdentificationNumber : '6CC99C'H exchangeIdentity : "DWLCCN6" switchIdentity : '0001'H recordSequenceNumber : '39D42F'H date : '1409071F'H serviceFeatureCode : '0002'H timeForEvent : '131A20'H CME20CP6.CallDataRecord.uMTSGSMPLMNCallDataRecord callIdentificationNumber : '699999'H