Удивительно, что вы можете сделать с каротажных или perl
как часть самой лесозаготовительной службы (срUbic
), но даже если вы просто пишете «быстрый сценарий» для синтаксического анализа журналов для отчетов (т. Е. то, что вы или кто-то еще не будете смотреть снова в течение нескольких месяцев или лет), помогает сделать их легкими в обслуживании.
Один из способов сделать это - обработать строки строк вашего журнала с помощью Regexp::Common
. Одно из преимуществ заключается в том, что RX::Common
соответствует практически «собственному документу», что вы делаете.Например, в соответствии с конкретным «RFC уступчивый» определения того, что представляет собой «домен» с помощью $linelist
вы вывесили:
use Regexp::Common qw /net/;
if ($line =~ /\?\@$RE{net}{domain}{-keep}/) { say $1 }
Затем, позже, если вам нужно вы можете добавить другие матчи например «числовой» IPv4 или IPv6-адреса, назначить их для последующего использования в сценарии, и т.д. (Perl6::Form
и IO::All
используется только для демонстрации - попробовать их!):
use IO::All ;
use Regexp::Common qw/net/;
use Perl6::Form;
my $purelog = io 'logfile.lines.txt' ;
sub _get_ftphost_names {
my @hosts =() ;
while ($_ = $purelog->getline) {
/\(\?\@$RE{net}{IPv6}{-sep => ":" }{-keep}/ ||
/\(\?\@$RE{net}{IPv4}{-keep}/ ||
/\(\?\@$RE{net}{domain}{-keep}/ and push @hosts , $1 ;
}
return \@hosts ;
}
sub _get_bytes_transfered {
... ;
}
my @host_list = _get_ftphost_names ;
print form
"{[[[[[[[[[[(30+)[[[[[[[[[[[[[}", @host_list ;
Одна из больших вещей о Regexp::Common
(помимо кражи идей regexp от источника) заключается в том, что он также позволяет легко свернуть собственные совпадения, вы можете использовать их для захвата других частей файла в легко понятном виде, добавляя их по частям. Затем, поскольку то, что должно было быть вашим четырехстрочным скриптом, растет и превращается в совместимый с ITIL инструмент корпоративной отчетности, вы и ваша карьера можете продвигаться вперед :-)
Изменить '\ b' на' \ s' – Sobrique