2014-02-17 5 views
2

Я хотел бы знать, как извлечь часть строки из файла в perl. У меня есть файл журнала, из которого я хочу извлечь несколько значимых сведений через perl-скрипт. Мне удалось получить всю строку, которую я искал, но мне нужна только часть этой линии.Как извлечь часть строки в perl

сценарий Perl (я использовал):

#!/usr/bin/perl 
use strict; 
use warnings; 

my $file='F:\3Np_RoboSitter\perl pgm\input.txt'; 

open my $fh, "<", $file or die $!; 

print "************************************************************\n"; 
print "DC status:\n\n"; 

while (<$fh>) { 
     print if /DC messages Picked/ .. /DC messages Picked from the Queue/; 
} 

print "\n************************************************************\n\n"; 
close ($fh); 

входного файла:

adfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfafafafqdrareeaf 
2014-02-14 00:18:04,840 1754897056 INFO ApplicationService aadfafa123 ApplicationService ApplicationServiceCustomerID  ApplicationServiceSessionToken Parse of XML started. |HostName=AAAAAA|TimeStamp=2014-02-14 00:16:39.044|Message=OUT;submitApplications.SubmitApplicationBatchProcess;Total 1311 DC messages Picked from the Queue.|Detail=<XMLNSC><LogMessage><messageText>Total 1311 DC messages Picked from the Queue.</messageText></LogMessage></XMLNSC>  
dafafafzcvzvsfdfafafffffffffffffffffffffffff 

Выход:

************************************************************ 
DC status: 

2014-02-14 00:18:04,840 1754897056 INFO ApplicationService aadfafa123 
ApplicationService ApplicationServiceCustomerID  ApplicationServiceSessio 
nToken Parse of XML started. |HostName=AAAAAA|TimeStamp=2014-02-14 00:16:39.0 
44|Message=OUT;submitApplications.SubmitApplicationBatchProcess;Total 1311 DC me 
ssages Picked from the Queue.|Detail=<XMLNSC><LogMessage><messageText>Total 1311 
DC messages Picked from the Queue.</messageText></LogMessage></XMLNSC> 
************************************************************ 

Желаемая Выход:

2014-02-14 00:18:04 
Total 1311 DC messages Picked from the Queue. *(Which is between <messagetext> tag)* 

команды, любезно предоставить ур ценное предложение для достижения этой цели в свободное время! ...

+1

'print $ 2 if m | <(messageText)> (. *?) |' –

ответ

2

Он всегда на основе входных данных. Ваш вход плохо отформатирован (не фиксированная длина, а не CSV), поэтому самым простым будет метод regexp.

while (my $line = <$fh>){ 
    my ($date) = split(/,/,$line,2); 
    if ($line =~ s!<messageText>(.+?)</messageText>!!is){ 
    print "$date\n$1\n"; 
    } 
} 
Смежные вопросы