Извлечение определенного шаблона из журнала - PullRequest
1 голос
/ 10 ноября 2010

Мне нужно извлечь запросы из файла журнала, который выглядит следующим образом:

<?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>

Важным вопросом является то, что регистрация транспортного средства может быть 5 строк, а иногда 17, его можно изменить. Это где мой текущий grep не удалось, я использовал:

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

Также другая проблема заключается в том, что иногда запрос может быть отправлен 2 или более раз, поскольку служба может быть недоступна по какой-либо причине, поэтому в файле могут быть одни и те же множественные запросы.

Я также должен исключить повторяющиеся запросы, способ узнать, что запрос дублируется, сравнивая n-ю строку (не последнюю строку) <vehicle id="2312313"></vehicle>, если идентификатор транспортного средства повторяется, чем его дубликат.

Как бы вы решили это? Предложения, код, псевдокод, все что угодно.

РЕДАКТИРОВАТЬ:

Файл журнала не является XML-файлом, это просто файл, содержащий небольшой процент запросов XML, и я не могу разобрать его как XML

РЕДАКТИРОВАТЬ II:

Я извлек только часть регистрации транспортного средства, используя @eugene y однострочную команду perl -nle 'm{<vehicleRegistration>} .. m{</vehicleRegistration>} and print' logfile, как мне избавиться от дубликатов, тех узлов с одинаковым идентификатором транспортного средства, я хочу сохранить только одну их копию.

Ответы [ 4 ]

2 голосов
/ 10 ноября 2010

Я бы использовал XML::Simple (или другой синтаксический анализатор XML) для извлечения данных. Data::Dumper может использоваться для проверки структур данных.

Обновление: вы можете извлечь элементы vehicleRegistration, например:

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

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

Или с однострочным перл:

perl -nle 'm{<vehicleRegistration>} .. m{</vehicleRegistration>} and print' logfile
1 голос
/ 11 ноября 2010

используйте команду awk или gawk в unix для извлечения регистрации ...

#!/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
0 голосов
/ 10 ноября 2010

Используйте 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 голосов
/ 10 ноября 2010

Используйте XPath (и в зависимости от того, что вы хотите сделать с результатом, возможно Xslt )

Для этого есть утилиты командной строки, здесь, например

...