perl正则表达式cisco配置文件打印多行

时间:2011-02-03 15:42:18

标签: regex perl

我正在寻找一个与下面的输出中的“vserver foo2”匹配的perl正则表达式。但是,我想返回匹配的行,以及以下所有行到“!”我只想打印“vserver foo2”的配置 谢谢你的帮助!

Cisco配置:

 vserver foo1
  描述foo
  虚拟1.1.1.1 tcp www
  serverfarm foofoo
  持续的再平衡
  在职

 vserver foo2
  说明foo2
  虚拟1.1.1.2 tcp www
  serverfarm foofoo2
  持续的再平衡
  在职

 vserver foo3
  说明foo3
  虚拟1.1.1.3
  serverfarm foo3
  复制csrp连接
  持续的再平衡
  在职

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

假设$ content包含所有文件,那么您应该执行以下操作:

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;
}

答案 3 :(得分: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;