2011-12-12 80 views
-2

我們需要通過在命令提示符處獲得的表格形式的輸出來匹配某個數據元素。以下是當前遵循的方法,其中$ 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, $_); } 
+0

您想處理/存儲第一行,如''0Storage_115.178.209.194admin''?你意識到1)你對'$ first'什麼都不做? 2)它不是本地的循環,你永遠不會解除它?它似乎沒有做任何事情,並且在循環工作之前,一個'shift @ tab'對於#1可能獲得的任何特殊行爲都是如此。 – Axeman

回答

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」。

+0

謝謝DAN。答案對我來說非常有用 – Nitesh

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, $_); 
} 

我已經去除了冗餘使用$_並修復了您的替換,因爲您可能不想刪除所有空格。