2013-03-12 65 views
2

下面是两个strings-Perl的正则表达式零次或一次比赛

12/31/2011 05:34:27;U;11.comp;host=win workgroup=home username=bob cmemory=1325133456 qmemory=1325133456 smemory=1325133456 uptime=1325289867 
12/31/2011 01:09:20;D;12.comp;host=win workgroup=home username=sam cmemory=1325151687 qmemory=1325151687 smemory=1325151687 uptime=1325228636 session=4677 downtime=1325270175 Exit_status=0 

从上面的字符串我要挑在Perl中使用正则表达式hostworkgroupusernameuptimedowntime值。

下面是我的Perl脚本 -

foreach $line (<FILE>) { 
    if($line =~ m<\d{2}/\d{2}/\d{4}\s+\d{2}:\d{2}:\d{2};[U|D].*host=(\w+)\s+workgroup=(\w+)\s+hostname=(\w+)\s+.*uptime=(\d+)\s+.*(downtime=)?(\d*)>){ 
     my $host  = $1; 
     my $workgroup = $2; 
     my $hostname = $3; 
     my $uptime = $4; 
     my $downtime = $5; 
     print "host=$host workgroup=$workgroup hostname=$hostname uptime=$uptime downtime=$downtime\n"; 
    } 
} 

唯一的问题,我面对这里是因为downtime。该属性可能不存在于该行中。我无法正确选择此字段。

回答

10

为什么不使用split代替?然后,你可以添加各种类别的哈希值,像这样:

use strict; 
use warnings; 
use Data::Dumper; 

while (<DATA>) { 
    my ($date, $foo, $bar, $data) = split /;/, $_, 4; 
    my %data = map { split /=/ } split ' ', $data; 
    print Dumper \%data; 
} 

__DATA__ 
12/31/2011 05:34:27;U;11.comp;host=win workgroup=home username=bob cmemory=1325133456 qmemory=1325133456 smemory=1325133456 uptime=1325289867 
12/31/2011 01:09:20;D;12.comp;host=win workgroup=home username=sam cmemory=1325151687 qmemory=1325151687 smemory=1325151687 uptime=1325228636 session=4677 downtime=1325270175 Exit_status=0 

输出:

$VAR1 = { 
      'workgroup' => 'home', 
      'cmemory' => '1325133456', 
      'qmemory' => '1325133456', 
      'uptime' => '1325289867', 
      'smemory' => '1325133456', 
      'username' => 'bob', 
      'host' => 'win' 
     }; 
$VAR1 = { 
      'qmemory' => '1325151687', 
      'Exit_status' => '0', 
      'smemory' => '1325151687', 
      'username' => 'sam', 
      'host' => 'win', 
      'workgroup' => 'home', 
      'cmemory' => '1325151687', 
      'session' => '4677', 
      'downtime' => '1325270175', 
      'uptime' => '1325228636' 
     }; 

如果你现在要参照“停工”的价值,你可以做一些这样的为:

my $downtime = $hash{downtime} // "N/A"; 

//是定义-或操作者,这里有些优选通过逻辑或||

+0

这很酷。两个问题(1)你能给我推荐'Regex'吗? (2)你可以修改你的分割,以便它可以选择'U'和'11.comp'? – 2013-03-12 17:50:24

+0

@RaviJoshi - 不要使用正则表达式来做到这一点。使用正确的工具来完成正确的工作。 – 2013-03-12 18:08:36

+0

@JackManey:我很困惑! “正确工作的正确工具”。请详细解释一下。为什么不是正则表达式? – 2013-03-12 18:10:42