匹配输出表中的数据

时间:2011-12-12 07:21:39

标签: perl

我们需要在命令提示符下获得的表格形式的元素匹配某些数据元素。以下是当前遵循的方法,其中$ Var包含输出。是否有一种最佳方法可以在不将命令输出定向到文件的情况下执行此操作。

请分享您的想法。

$Var = "iSCSI Storage     LHN StgMgmt Name  IP              Name
==============================================================
0                 Storage_1         15.178.209.194  admin
1                 acct-mgmt         15.178.209.194  storage1
2                 acct-mgmt2        15.178.209.194  storage2";

@tab = split("\n",$Var);
foreach (@tab) {
    next if ($_ !~ /^\d/);
    $_ =~ s/\s+//g;
    $first=0 if($_ =~ /Storage/i && /15.178.209.194/);
    push(@Array, $_); }

2 个答案:

答案 0 :(得分:1)

$_ =~ /Storage/i && /15.178.209.194/很傻。这会像这样分解:($_ =~ /Storage/i) && (/15.178.209.194/)。一致使用$_或不使用//s///运算符会自动对$_进行操作。

此外,您应该知道在正则表达式/15.178.209.194/中,.被解释为任何字符。要么逃避它们,要么使用index()功能。

此外,我建议您使用split()分隔每一行。这允许您比较每个单独的列。您可以将split()与正则表达式一起使用:@array = split(/\s+/, $string);

最后,我不确定$first的用途,但我注意到该输入中的所有三个采样行都会触发$first=0,因为它们都包含该IP和字符串“storage”。

答案 1 :(得分:1)

如果我理解正确,你想这样调用你的脚本:

./some_shell_command | perl perl_script.pl

您要使用的是Perl钻石运算符<>

#!/usr/bin/perl

use strict;
use warnings;

my $first;
my @Array;

for (<>) {
    next unless /^\d/;
    s/\s+/ /g;
    $first = 0 if /Storage/i && /15.178.209.194/;
    push(@Array, $_);
}

我删除了$_的多余用途并修复了您的替换,因为您可能不想删除所有空格。