2015-04-20 4 views
0

поэтому у меня есть небольшая проблема, потому что мне нужно напечатать имя хоста, которое bettwen «(@?)», Например:Используйте регулярные выражения, чтобы найти имя хоста

Apr 17 23:39:02 test pure-ftpd: ([email protected]) [INFO] New connection from researchscan425.eecs.umich.edu 

И мне нужно напечатать «researchscan425 .eecs.umich.edu».

Я пытался что-то вроде:

if(my ($test) = $linelist =~ /\b\(\?\@(\S*)/) 
{ 
    print "$test\n"; 
} 

Но не печатает ничего мне.

+1

Изменить '\ b' на' \ s' – Sobrique

ответ

2

Вы можете использовать это регулярное выражение:

\(\[email protected](.*?)\) 

researchscan425.eecs.umich.edu будет захвачен в группе 1.

См demo

Sample code:

my $linelist = 'Apr 17 23:39:02 test pure-ftpd: ([email protected]) [INFO] New connection from researchscan425.eecs.umich.edu'; 
if(my ($test) = $linelist =~ /\(\[email protected](.*?)\)/) 
{ 
    print "$test\n"; 
} 
+0

Что касается '\ b', я объяснил это в одном из моих предыдущих сообщений: http://stackoverflow.com/questions/29562943/python-regex-not-matching-as-required/29563789#29563789. Вам действительно не нужно использовать его здесь или, по крайней мере, в оригинальном месте. –

1

Как насчет:

if(my ($test) = $linelist =~ /\(\?\@([^\s)]+)/) 
+0

Есть ли разница между '[^ \ s]' и '\ S', о которой я не знаю? Я думаю, что они такие же? – Sobrique

+0

@Sobrique: Нет никаких различий между '[^ \ s]' и '\ S', но в моем регулярном выражении я добавил правильную скобку. – Toto

1

Вам необходимо удалить \b, который существует до (. Поскольку граница слова не существует до ( (неглавный символ) и после пробела (non-word charcater).

my $linelist = 'Apr 17 23:39:02 test pure-ftpd: ([email protected]) [INFO] New connection from researchscan425.eecs.umich.edu'; 
if(my ($test) = $linelist =~ /\(\?\@([^)]*)/) 
{ 
    print "$test\n"; 
} 
+0

Я думаю, что '\ b' _should_ работает. Я не могу понять, почему это не так? Но да, если вы переключите его на '\ s', он отлично работает. – Sobrique

+0

, если вы используете '\ b', это не сработает. –

0

Проблема заключается в определении \b.

Это "граница слова" - на regex101, что означает:

(^\w|\w$|\W\w|\w\W) 

Теперь, почему это вызывает вас проблемы - ( не word character. Таким образом, переход от space к bracket не вызывает этот шаблон.

Переключите шаблон для:

\s\(\?\@(\S+) 

И это будет работать. (Примечание. Я изменил * на +, потому что вы, вероятно, хотите один или несколько, а не ноль или больше).

0

Удивительно, что вы можете сделать с каротажных или 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 инструмент корпоративной отчетности, вы и ваша карьера можете продвигаться вперед :-)

Смежные вопросы