我需要帮助我的正则表达式从这个日志文件中获取主机信息:
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=)(.+)/){
谢谢!
答案 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+)/