regex - 零或一个匹配的 Perl 正则表达式

标签 regex 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

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

下面是我的 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";
    }
}

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

最佳答案

为什么不使用 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";

其中 // 是定义或运算符,在这里比逻辑或 || 更受欢迎。

关于regex - 零或一个匹配的 Perl 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15367700/

相关文章:

perl - 在 GitHub Action 的新作业中使用上一作业的输出

perl-如何将字符串视为二进制数?

linux - 如何使用 CGI 和 Perl 的 Net::OpenSSH 模块在远程 Linux 服务器上执行系统命令?

ruby - 使用 Ruby 进行文件操作

php - 用其他数组中的值替换数组中的占位符

python - 使用正则表达式从python列表中删除元素

正则表达式可选词

python - 正则表达式 '|' 运算符与每个子表达式的单独运行

perl - 如果 getcwd() 无权访问,为什么要回退到 cwd()?

c# - 如何在 Linux 上使用 Mono 将 Perl 解释器嵌入到我的 C# 程序中?