使用正则表达式查找主机名

时间:2015-04-20 11:56:34

标签: regex perl

所以我没有什么问题,因为我需要打印主题名称,例如:#?;(?@)",

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";
}

但它并没有给我打印任何东西。

5 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式:

\(\?@(.*?)\)

researchscan425.eecs.umich.edu将被捕获到第1组。

请参阅demo

Sample code

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。因此,从spacebracket的转换不会触发此模式。

将您的模式切换为:

\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::CommonPerl6::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标准的公司报告工具,您和您的职业生涯可以快速发展: - )