perl - regex帮助从日志中解析主机名

时间:2010-08-26 03:23:26

标签: regex perl

我需要帮助我的正则表达式从这个日志文件中获取主机信息:

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 个答案:

答案 0 :(得分:1)

如果从匹配项中排除空格和引号,它会更好用:

host=([^\s"]+)

通过排除引号,这将与第一行中的host=...匹配,而忽略第二行中的--host="..."

编辑:这个简单的测试脚本适用于您的示例输入。如果你运行它会发生什么?

#!/usr/bin/env perl

while ($line = <>) {
    if ($line =~ /host=([^\s"]+)/) {
        print "$1\n";
    }
}

答案 1 :(得分:1)

这是一个正则表达式:

/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

答案 2 :(得分:0)

试试这个:

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

如果您实际上并不想将其解析为数据(因为您总是匹配它,它似乎不需要),所以host=周围不需要parens。使用[^"\s]+将为您提供一个字符串,其中不包含"或空白字符,这将阻止它超出字段边界。

捕获之前的"?位将允许引用(或不引用)值,同时保留任何引号以外的实际匹配数据,因此您不必担心在您的实际匹配数据中删除它们数据处理。

答案 3 :(得分:0)

如果主机名不能包含空格,那么我会执行:/(host=)(\S+)/