在Perl

时间:2015-05-14 09:08:42

标签: regex string perl

我有一个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";
            }
            }
  }

5 个答案:

答案 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)

您可以使用

grep -P "(?m)^(?!.*\[m{3}\].*\[a(?:\.a){3}\]).*$" file

参见演示。

https://regex101.com/r/mT0iE7/15

答案 2 :(得分:0)

如果mmma.a.a的顺序相同,那么您可以使用以下内容,

grep -v '.*\[mmm\].*?\[a\.a\.a\.a\]' file

如果您不知道订单,请使用此选项。

grep -P '^(?=.*\[mmm\])(?=.*?\[a\.a\.a\.a\]).+(*SKIP)(*F)|.+' file

DEMO

你可以在perl中使用相同的正则表达式,

perl -lne 'print if /^(?=.*\[mmm\])(?=.*?\[a\.a\.a\.a\]).+(*SKIP)(*F)|.+/' file

答案 3 :(得分:0)

您可以使用negative look ahead

layout_above

DEMO

前面的正则表达式将匹配包含^(((?!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)

对于不使用mapgrep的简单方法:

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]