【问题标题】:Grep pattern file - filter duplicate hits on patternsGrep 模式文件 - 过滤模式上的重复命中
【发布时间】:2014-03-10 18:45:41
【问题描述】:

我有一个与 grep 一起使用的模式文件,通过一些日志,但由于模式出现在日志中的多个位置,我得到很长的输出。我想要的只是模式文件中每个模式的一行。

例如,

模式文件

AAA
BBB
CCC

日志文件

12 AAA
23 BBB
45 BBB
67 DDD
89 BBB

所以grep -f patternfile Logfile,我会得到

12 AAA
23 BBB
45 BBB
89 BBB

但我真正想要的只是

12 AAA
23 BBB

不确定如何通过管道传输。 谢谢

【问题讨论】:

    标签: grep


    【解决方案1】:

    这是一个 perl 程序,可以满足您的需求:

    pgrep.pl [模式文件] [日志文件]

    警告是模式文件没有通配符

    pgrep.pl ---

    #/usr/bin/perl
    
    use strict;
    
    sub usage
    {
        print "usage: $0  [patternFile]  [logFile ]\n";
        exit;
    }
    
    sub load
    {
       my $file = shift;
       open my $input, "<", $file or die "unable to open $file : $!";
       my @data=<$input>;
       close $input;
       foreach ( @data )
       {
           chomp;
           s/\cM//g;
           s/^\s+//;
           s/\s+$//;
       } 
       return @data;
    }
    my $patternFile = shift or &usage();
    
    my @patterns = &load( $patternFile );
    
    my $logFile = shift or usage();
    
    my @data = &load( $logFile );
    
    foreach my $p ( @patterns )
    {
        next if not length $p;
        my ($found ) = grep {/$p/} @data;
        print $found,"\n" if $found;
    }
    

    【讨论】:

      【解决方案2】:

      这个awk 单线可以提供帮助:

      awk 'NR==FNR{a[$1]++;next}($2 in a){print $0; delete a[$2]}' pat log
      

      测试:

      $ cat pat
      AAA
      BBB
      CCC
      

      $ cat log
      12 AAA
      23 BBB
      45 BBB
      67 DDD
      89 BBB
      

      $ awk 'NR==FNR{a[$1]++;next}($2 in a){print $0; delete a[$2]}' pat log
      12 AAA
      23 BBB
      

      $ grep -f pat log | sort -uk2
      12 AAA
      23 BBB
      

      【讨论】:

        【解决方案3】:

        尝试:

        grep -f patternfile Logfile > tempvar; awk '!a[$0]++' tempvar
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-04
          • 1970-01-01
          • 2014-06-26
          • 2018-07-27
          • 1970-01-01
          • 1970-01-01
          • 2013-10-09
          • 2015-06-12
          相关资源
          最近更新 更多