所以我没有什么问题,因为我需要打印主题名称,例如:#?;(?@)",
Apr 17 23:39:02 test pure-ftpd: (?@researchscan425.eecs.umich.edu) [INFO] New connection from researchscan425.eecs.umich.edu
我需要打印" researchscan425.eecs.umich.edu"。
我尝试过类似的事情:
if(my ($test) = $linelist =~ /\b\(\?\@(\S*)/)
{
print "$test\n";
}
但它并没有给我打印任何东西。
答案 0 :(得分:2)
您可以使用此正则表达式:
\(\?@(.*?)\)
researchscan425.eecs.umich.edu
将被捕获到第1组。
请参阅demo
my $linelist = 'Apr 17 23:39:02 test pure-ftpd: (?@researchscan425.eecs.umich.edu) [INFO] New connection from researchscan425.eecs.umich.edu';
if(my ($test) = $linelist =~ /\(\?@(.*?)\)/)
{
print "$test\n";
}
答案 1 :(得分:1)
怎么样:
if(my ($test) = $linelist =~ /\(\?\@([^\s)]+)/)
答案 2 :(得分:1)
您需要删除\b
之前存在的(
。因为在(
(非单词字符)之前和空格之后(非单词charcater )之前不存在单词边界。
my $linelist = 'Apr 17 23:39:02 test pure-ftpd: (?@researchscan425.eecs.umich.edu) [INFO] New connection from researchscan425.eecs.umich.edu';
if(my ($test) = $linelist =~ /\(\?\@([^)]*)/)
{
print "$test\n";
}
答案 3 :(得分:0)
这里的问题是\b
的定义。
它"字边界" - 在regex101上,这意味着:
(^\w|\w$|\W\w|\w\W)
现在,为什么这会导致您出现问题 - (
不是word character
。因此,从space
到bracket
的转换不会触发此模式。
将您的模式切换为:
\s\(\?\@(\S+)
它会起作用。 (注意 - 我已将*
更改为+
,因为您可能需要一个或多个,而不是零或更多。
答案 4 :(得分:0)
使用日志记录工具或使用perl
作为日志服务本身的部分,您可以做些什么( cf {{3} }),但即使你只是在写一个"快速脚本"解析报告的日志(即你或其他人赢得的东西,再过几个月或几年),这有助于使它们易于维护。
执行此操作的一种方法是使用Ubic
处理日志文件行的行。一个优点是RX::Common
实际匹配"自我文件"你在做什么。例如,要匹配特定的" RFC兼容"构成"域的定义"使用您发布的$linelist
:
use Regexp::Common qw /net/;
if ( $line =~ /\?\@$RE{net}{domain}{-keep}/ ) { say $1 }
然后,如果您需要,可以添加其他匹配例如"数字" IPv4或IPv6地址,分配它们以供稍后在脚本中使用等。(Regexp::Common
和Perl6::Form
仅用于演示目的 - 试用它们!):
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
(除了从源代码中窃取正则表达式的想法之外)的一个好处是,它还可以很容易地滚动你自己的匹配,你可以使用它们来捕获文件的其他部分。容易理解的方式逐个添加它们。然后,随着您的四行脚本的增长并将其转换为符合ITIL标准的公司报告工具,您和您的职业生涯可以快速发展: - )