Grep模式文件 - 过滤模式上的重复命中

时间:2014-03-10 18:45:42

标签: grep

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

例如,

patternfile

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

不确定如何管道。 感谢

3 个答案:

答案 0 :(得分:0)

这是一个执行你想要的perl程序:

pgrep.pl [patternfile] [logfile]

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

尝试:

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