2011-02-03 45 views
1

我正在尋找一個perl正則表達式,將匹配從下面的輸出「vserver foo2」。但是,我想要返回匹配的行,並且所有以下行直到「!」我只想打印「vserver foo2」的配置文件
Thx尋求幫助!perl正則表達式思科配置文件打印多行

思科配置:

虛擬服務器foo1
描述富
虛擬1.1.1.1 TCP WWW
服務器農場foofoo
持續再平衡
在職

虛擬服務器foo2的
描述foo2的
虛擬1.1.1.2 TCP WWW
服務器農場foofoo2
持續再平衡
在職

虛擬服務器foo3
描述foo3
虛擬1.1.1.3
服務器農場foo3
複製CSRP連接
持續再平衡
在職

回答

7
perl -ne 'print if /^vserver foo2/ .. /^!/' config.txt 
+1

這就是爲什麼我愛perl。它只是得到你的意思:) – 2011-02-03 17:21:58

0

與字符串vserver foo2匹配的正則表達式很簡單:/vserver foo2/

對於這個問題,獲取多行最簡單的方法是在加載該文件時覆蓋input record separator變量$/,以便每個記錄(「!」之間的所有內容都保存爲單個標量)。例如,

local $/ = "!\n"; 
open my $fh, '<', $cisco_config_file; 
my @configurations = <$fh>; 

現在@configurations的每個元素都包含整個記錄。爲了獲得匹配的記錄,你剛纔說

my @matching_records = grep { /vserver foo2/ } @configurations; 
+0

謝謝大家的快速反應和偉大的建議。 – dars33 2011-02-03 17:48:31

1
open IN, '<', '1.txt'; 
while(<IN>) { 
    if (/^vserver foo2$/) { $found = 1 } 
    last if (/^!$/ and $found); 
    print if $found 
} 
1

假設$內容擁有所有的文件,那麼你應該這樣做:

my ($config) = $content =~ m/\n!\n(vserver foo2[^!]*)/sm; 

假設你不'沒有'!'在你的配置中的某個地方。

但更好的方式來做到這一點,我認爲,將是運行一個循環,並跳過的正則表達式: 假設$ fh爲文件句柄:

my $line; 
# cut the leading lines 
do { 
    $line = <$fh>; 
    chomp $line; 
while ($line ne "!"); 

while ($line = <$fh>) { 
    chomp $line; 
    my $found = ($line eq "vserver foo2"); 
    while ($line = <$fh>) { 
     chomp $line; 
     break if $line eq "!"; 
     say $line if $found; 
    } 
    break if $found; 
}