2010-11-10 43 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