2012-10-13 46 views
2

我在從Ubuntu 12.04框的Perl腳本中的某個變量中抽取某些值時遇到了一些問題。在Perl中創建正則表達式以提取值

我看了看這個頁面:How to extract string following a pattern

這是那種我想要做的。我需要在特定模式之後提取字符串值。 這裏是我迄今爲止代碼:

foreach $HDD (@sds) 
{ 
    $hdStat = `hdparm -i $HDD | grep -Po 'Model=\K.*?(?=,)'`; 
    $sdModel{$HDD} = $hdStat; 
    $hdStat = `hdparm -i $HDD | grep -Po 'SerialNo=\K.*?(?=")'`; 
    $sdSerial{$HDD} = $hdStat; 
} 
foreach $HDD (keys %sdModel) 
{ 
    print $sdModel{$HDD}; 
} 
foreach $HDD (keys, %sdSerial) 
{ 
    print $sdSerial{$HDD}; 
} 

它會收益的模型串得很好,但它不會返回的SerialNo字符串。代碼不一定要用grep;我剛剛修改了上面鏈接的代碼。並看到我是如何可怕的與正則表達式,我可能會失去一些基本的東西在這裏。

順便說一下,這段代碼的目的是查看/ dev文件夾來查找任何磁盤驅動器,如果它確實存在,將其設置爲一個數組,然後上述腳本將獲取它的Model#和Serial#。 此外,如果有人看到更好的方式來做我正在做的事情,我非常樂於接受建議。我對Perl仍然很陌生(到目前爲止只有一個星期左右)。

+2

也許你應該表現出你的輸入和預期輸出代替。這就像詢問如何找到從紐約到波士頓的路線,並詢問如何駕駛汽車的方向之間的區別。 – TLP

+0

@TLP對不起,我是新來的論壇,儘管我是新來的Perl。我的輸入將是數組sds中的一個元素,在這種情況下,它將是'/ dev/sda'。輸出應該是該驅動器的型號和序列號,在這種情況下應該是'ST380011A'和'5JVJ2BBA'。但是,序列號不會回來,我猜這是因爲之後的分隔符。只是一個猜測。 – Arkevius

回答

1

首先,你不打印$ sdSerial。

其次,你可以節省一些外部調用,並簡化您的正則表達式:

foreach my $HDD (@sds) { 
    my @hdparm = `hdparm -i $HDD`; 
    foreach my $ln (@hdparm) { 
     if (my($model, $serial) = ($ln =~ m/Model=(.+?),.+?,\s*SerialNo=(.+)/)) { 
      $sdModel{$HDD} = $model; 
      $sdSerial{$HDD} = $serial; 
     } 
    } 
} 

以上可以簡化爲:

foreach my $HDD (@sds) { 
    my $hdparm = `hdparm -i $HDD`; 
    if (my($model, $serial) = ($hdparm =~ m/Model=(.+?),.+?,\s*SerialNo=(.+)/)) { 
     $sdModel{$HDD} = $model; 
     $sdSerial{$HDD} = $serial; 
    } 
} 
+0

我一定忘了添加該打印,謝謝你的注意。雖然我在原始代碼中使用了它,所以這不是問題。 我試過了你的代碼,它的工作原理也給我留了一點空間,謝謝你的幫助! – Arkevius

0

爲了提取序列號試試這個正則表達式:

$hdStat = `hdparm -i $HDD | grep -Po 'SerialNo=\K.*?'`; 
+0

這似乎不適合我。我直接在我的Ubuntu盒子的CLI上鍵入了它,但是沒有任何返回結果(我剪掉了變量,然後離開「hdparm ...」。 – Arkevius