perl - regex help разбирает имя хоста из журнала - PullRequest
0 голосов
/ 26 августа 2010

Мне нужна помощь с моим регулярным выражением, чтобы получить информацию о моем хосте из этого файла журнала:

Tue Aug 24 10:22:14 2010: test1.colo_lvm:check:INFO:    host=test1.dom.colo.name.com
Tue Aug 24 10:22:14 2010: test1.colo_lvm:check:INFO: "/home/bin64"/admin --user="foo-bar" --password="*****" --host="test1.dom.colo.name.com" --port="9999" --socket="/tmp" variables

Мое регулярное выражение также захватывает вторую строку, чтобы включить имя хоста в двойные кавычки и другие фрагменты данных в этой строке, которые меня не интересуют. Первая строка только в порядке. Итак, я просто заинтересован в test1.dom.colo.name.com и больше ничего.

Мое регулярное выражение таково:

if ($line =~ m/(host=)(.+)/){

Спасибо!

Ответы [ 4 ]

1 голос
/ 26 августа 2010

Вот регулярное выражение для этого:

/host="?([^\s"]+)"?/m

Ваша первая строка не имеет кавычек вокруг данных;вторая строка делает.Следовательно, конструкция "?.Возможно, у вас не может быть пробела (или закрывающей кавычки), поэтому берите все, кроме этих.Следовательно ([^\s"]+)

Приветствия!

Редактировать: Это работает:

use strict; use warnings;
my $i=1;
while (<DATA>) {
    print "match on line $i: $1\n" if /host="?([^\s"]+)"?/;
    $i++;
}

__DATA__
Tue Aug 24 10:22:14 2010: test1.colo_lvm:check:INFO:    host=test1.dom.colo.name.com
Tue Aug 24 10:22:14 2010: test1.colo_lvm:check:INFO: "/home/bin64"/admin --user="foo-bar" --password="*****" --host="test1.dom.colo.name.com" --port="9999" --socket="/tmp" variables

Вывод:

match on line 1 test1.dom.colo.name.com
match on line 2 test1.dom.colo.name.com
1 голос
/ 26 августа 2010

Будет лучше, если вы исключите из матча пробелы и кавычки:

host=([^\s"]+)

Если исключить кавычки, это будет соответствовать host=... в первой строке, игнорируя --host="..." во второйline.

Edit: Этот простой тестовый скрипт работает для меня на вашем примере ввода.Что произойдет, если вы запустите это?

#!/usr/bin/env perl

while ($line = <>) {
    if ($line =~ /host=([^\s"]+)/) {
        print "$1\n";
    }
}
0 голосов
/ 26 августа 2010

Если имя хоста не может содержать пробелы, я бы сделал: /(host=)(\S+)/

0 голосов
/ 26 августа 2010

Попробуйте это:

$line =~ m/host="?([^"\s]+)/

Вам не нужны скобки вокруг host=, если вы на самом деле не хотите анализировать это как данные (что, поскольку вы всегда сопоставляете их, кажется, что вам это не нужно). Использование [^"\s]+ даст вам строку, в которой нет символов " или пробелов, что не позволит ей работать за пределами поля.

Бит "? перед захватом позволяет указывать значение в кавычках (или нет), сохраняя при этом любые кавычки вне фактических сопоставленных данных, поэтому вам не нужно беспокоиться об их удалении при обработке данных. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...