我有一个模式文件,我使用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
不确定如何管道。 感谢
答案 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