我有一个Logfile,其格式如下:
[Time] [mmm] [DATA] [rule] [a.a.a.a]
[Time] [ppp] [DATA] [rule] [a.a.a.a]
[Time] [mmm] [DATA] [rule] [c.c.c.c]
在cant'找到一种方法来打印没有特定子字符串的字符串。我希望能够在没有匹配[mmm]
和[a.a.a.a]
的子字符串行的情况下打印整个字符串输出。最终的输出是:
[Time] [ppp] [DATA] [rule] [a.a.a.a]
[Time] [mmm] [DATA] [rule] [c.c.c.c]
我是否将索引模块与两个子字符串一起使用或者以某种方式使用grep?我是以错误的方式看待这个吗?非常感谢任何帮助!!!
在我的perl脚本中,我有一个搜索此内容的部分,并将此部分打印为字符串:
sub Section
{
my @event_rule = ("A", "B", "C");
foreach (@event_rule)
{
my $result1 = `fgrep -h 'DATA' $logfile1 | grep "$_" | head -n10`;
if (length $result1)
{
print "$result1\n";
}
}
}
答案 0 :(得分:4)
无需像grep
这样的外部程序:
#!/usr/bin/perl
use warnings;
use strict;
my @rule = ('[mmm]', '[a.a.a.a]');
my $regex = join '.*', map quotemeta, @rule; # Create one regular expression from the "rules".
$regex = qr/$regex/; # Compile it.
my $c = 0;
while (<>) {
$c += print if /DATA/ && ! /$regex/;
last if $c > 9; # Only print the first 10 lines.
}
答案 1 :(得分:1)
答案 2 :(得分:0)
如果mmm
和a.a.a
的顺序相同,那么您可以使用以下内容,
grep -v '.*\[mmm\].*?\[a\.a\.a\.a\]' file
如果您不知道订单,请使用此选项。
grep -P '^(?=.*\[mmm\])(?=.*?\[a\.a\.a\.a\]).+(*SKIP)(*F)|.+' file
你可以在perl中使用相同的正则表达式,
perl -lne 'print if /^(?=.*\[mmm\])(?=.*?\[a\.a\.a\.a\]).+(*SKIP)(*F)|.+/' file
答案 3 :(得分:0)
您可以使用negative look ahead:
layout_above
前面的正则表达式将匹配包含^(((?!a.a.a.a).)*mmm((?!a.a.a.a).)*)$|^(((?!mmm).)*a.a.a.a((?!mmm).)*)$
但不包含mmm
的字符串或包含a.a.a.a
但不包含a.a.a.a
的字符串。
答案 4 :(得分:0)
对于不使用map
或grep
的简单方法:
use strict;
use warnings;
while(<DATA>){
chomp;
my @split = split(/\s+/);
print "$_\n" unless ($split[1] eq '[mmm]' and $split[4] eq '[a.a.a.a]');
}
__DATA__
[Time] [mmm] [DATA] [rule] [a.a.a.a]
[Time] [ppp] [DATA] [rule] [a.a.a.a]
[Time] [mmm] [DATA] [rule] [c.c.c.c]