2010-11-10 60 views
1

我需要提取從日誌文件看起來像這樣的請求中提取一定的模式:從日誌

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<vehicleRegistration> 
.... XML in between .... 
.... XML in between .... 
.... XML in between .... 
.... XML in between .... 
... at nth line there is line like this <vehicle id="2312313"></vehicle> 
.... XML in between .... 
.... XML in between .... 
</vehicleRegistration> 

重要的問題是,vehicleRegistration可以5日線和17有時,它的多變。這就是我目前的grep的失敗,我用:

grep -A 13 "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" vehicle.log 

而且另一個問題是,有時一個請求可以發送2次以上,因爲該服務可能會因某些原因無法使用,所以有可能是相同的文件中有多個請求。

我也應該排除重複的請求,通過比較第n行(不是最後一行)<vehicle id="2312313"></vehicle>,如果車輛id重複比它的重複,知道請求是重複的方式。

你將如何解決這個問題?建議,代碼,僞代碼,任何東西都是值得歡迎的。

編輯:

日誌文件不是一個XML文件,它只是一個包含XML請求的一些小的百分比和文件,我不能分析它爲XML

編輯II:

我只提取車輛註冊部分,使用@eugene y一行命令perl -nle 'm{<vehicleRegistration>} .. m{</vehicleRegistration>} and print' logfile,我怎樣才能擺脫重複,那些具有相同車輛ID的節點,我只想保留這些副本。

回答

0

使用XPath來恢復XML元素節點。各種現代腳本語言有很多框架。

用Perl,你可以這樣做:

#!/usr/bin/perl 

use strict; 
use warnings; 
use XML::XPath; 

my $file = 'vehicleRegistration.xml'; 
my $xp = XML::XPath->new(filename => $file); 

print "Vehicle id: ".$xp->find('//vehicle/@id')."\n"; 

如果需要,解析你的日誌文件,以提取XML文檔部分,然後在其上運行的XPath表達式來恢復元素和數據你要。

+0

感謝您的迴應,上面做了什麼?打印車輛ID?我需要使用此車輛識別號來清除之間的任何內容 ant 2010-11-10 15:01:07

+0

是的,這需要您切除的XML塊並打印出車輛ID。 – 2010-11-10 15:23:00

+0

我想刪除車輛註冊節點,其中包含與任何其他車輛註冊節點相同的車輛ID,我該怎麼做呢?僞代碼或代碼會很棒,或者教程或任何可能幫助我完成這些任務的東西。 tnx – ant 2010-11-10 16:10:53

2

我會使用XML::Simple(或其他XML解析器)來提取數據。 Data::Dumper可用於檢查數據結構。

更新:您可以提取vehicleRegistration內容是這樣的:

open my $fh, '<', 'logfile' or die $!;  
my $xml = ""; 

while (<$fh>) { 
    if (m{<vehicleRegistration>} .. m{</vehicleRegistration>}) { 
     $xml .= $_; 
    } 
} 

或者用perl的一行代碼:

perl -nle 'm{<vehicleRegistration>} .. m{</vehicleRegistration>} and print' logfile 
+0

我剛編輯我的問題,日誌文件不是XML文件,它只是包含了一些要求,所以我不能分析它爲XML – ant 2010-11-10 14:18:15

+0

@ c0mrade - 如何在這些XML片段分開嗎?你能提取這些XML塊並按照eugene的建議解析它們嗎? – eumiro 2010-11-10 14:19:57

+0

@eumiro @eugene y是的我已經分離了XML部分,我該如何擺脫重複? – ant 2010-11-10 14:47:01

0

使用XPath(取決於你想用做什麼結果,可能Xslt

有這樣的命令行工具,here, for example

+0

對不起,我剛剛編輯我的問題,日誌文件不是xml文件,它只是包含一些請求所以我不能解析它爲xml – ant 2010-11-10 14:17:59

+2

當然,您可以:)提取之間的文本,並將其傳遞給XML解析器... – 2010-11-10 14:20:12

1

在unix中使用awk或gawk命令來提取註冊...

#!/usr/bin/awk -f 

/^<vehicleRegistration>/ { printit="true" } # set the print flag on 
printit ~ "true" { print }     # if printflag set print 
/^</vehicleRegistration>{ printit="false" } # turn print flag off