【问题标题】:Multiline string search using sed or perl使用 sed 或 perl 进行多行字符串搜索
【发布时间】:2012-03-13 10:02:17
【问题描述】:

你可能会说这是一个重复的帖子......但我已经尝试过以前的解决方案,但它们似乎不起作用!由于某种原因,perl 我看到了涉及替换替换的解决方案,但它们替换了文本匹配模式而不是显示它!。以下是原文

ClassOne:error=9607
ClassTwo:This is junk test
ClassThree:I|want|to|extract|this|text|after|error=9607

在找到error=9607 之后,我想提取所有包含ClassThree:.... 的行。最好我想要一个单行命令来完成此操作,因为我将在大量服务器上的多个文件中运行它(使用与 ssh 命令一致的命令)。

感谢您提供这方面的帮助/指点。

【问题讨论】:

  • 感谢大家的解决方案!不幸的是,以下命令都不能在我的服务器上运行,我认为这是因为在我的服务器上运行旧版本的 AIX。幸运的是,我根据@potong 的 cmets 对awk 进行了更多研究,这似乎有解决方案awk /begin/,/end/ filename 非常整洁,嗯? :-)

标签: perl search command-line sed multiline


【解决方案1】:

如果ClassThree 总是在error=9607 之后两行,您可以:

grep -A 2 'error=9607' input.txt

【讨论】:

    【解决方案2】:

    这可能对你有用:

    sed '/error=9607/,/ClassThree/{//!d}' file
    ClassOne:error=9607
    ClassThree:I|want|to|extract|this|text|after|error=9607
    

    如果你只想要ClassThree 行:

    sed '/error=9607/,/ClassThree/{/ClassThree/!d}' file
    ClassThree:I|want|to|extract|this|text|after|error=9607
    

    如果您希望此后所有行都包含ClassThree

    cat <<! >file
    > ClassOne:error=9607
    > ClassTwo:This is junk test
    > ClassThree:I|want|to|extract|this|text|after|error=9607
    > ClassOne:error=9608
    > ClassTwo:This is junk test
    > ClassThree:I|want|to|extract|this|text|after|error=9607
    > ClassOne:error=9609
    > ClassTwo:This is junk test
    > ClassThree:I|want|to|extract|this|text|after|error=9607
    >!
    sed '/error=9607/h;G;/ClassThree.*\n./P;d' file
    ClassThree:I|want|to|extract|this|text|after|error=9607
    ClassThree:I|want|to|extract|this|text|after|error=9607
    ClassThree:I|want|to|extract|this|text|after|error=9607
    

    或者这个 awk 解决方案:

     awk '/error=9607/{p=1};/ClassThree/ && p' file
    

    【讨论】:

      【解决方案3】:

      这是一个 perl 尝试

      编辑:我还添加了特定的错误检查

      use strict;
      my @errors = (9607,9608);
      open(FILE,"filescan.txt")||die "Error: cannot read file\n$!";
      while(<FILE>){
          chomp(my $line = $_ );
          if ( $line =~ /^ClassOne:error=(\d+)/ ) {
              my $errorCode = $1;
              if ( grep { $_ == $errorCode } @errors ) {
                  print "$line\n";
                  while(<FILE>){
                      chomp(my $line = $_ );
                      if ( $line =~ /^ClassThree:.*\|error=$errorCode/ ) {
                          print "$line\n";
                          last;
                      }
                  }
                  print "----------\n";
              }
          }
      }
      close FILE;
      

      输出:

      ClassOne:error=9607
      ClassThree:I|want|to|extract|this|text|after|error=9607
      ----------
      ClassOne:error=9608
      ClassThree:I|want|to|extract|this|text|after|error=9608
      ----------
      

      【讨论】:

        【解决方案4】:
        $ perl -ple 'print if /^ClassThree/ && /error=9607/ .. /\0/' file
        

        【讨论】:

          猜你喜欢
          • 2019-07-03
          • 1970-01-01
          • 2014-04-26
          • 2017-09-17
          • 2021-06-21
          • 2013-08-09
          • 2013-05-02
          • 2014-03-06
          • 2015-06-15
          相关资源
          最近更新 更多