从一行到另一行的 Grep

从一行到另一行的 Grep

我有一个包含数千行的文件。我需要从一行 grep 到另一行并包含这些行之间的所有内容

Wed Nov 25 23:08:01 GMT 2015即从到 的行Wed Nov 25 23:59:24 GMT 2015

[...]
abc
abc
abc
Wed Nov 25 23:08:01 GMT 2015
def
def
def
def
... (1000 lines with def)
Wed Nov 25 23:59:24 GMT 2015
xyz
xyz
xyz
[...]

你能建议什么是正确的 grep 表达式吗?

答案1

sed 和 grep 的组合应该可以解决问题。像这样的东西:

sed '1,/Wed Nov 25 23:08:01 GMT 2015/d;/Wed Nov 25 23:59:24 GMT 2015/,$d' < file.txt | grep <yourstring>

请注意,此示例将不包含与日期匹配的行,仅包含日期之间的所有内容。

答案2

我无法建议grep表达方式,因为这不是grep目的。

我建议改为使用perland 范围运算符:

#!/usr/bin/env perl
use strict;
use warnings;

while ( <> ) {  
    print if m/Wed Nov 25 23:08:01 GMT 2015/ .. /Wed Nov 25 23:59:24 GMT 2015/;
}

如果格式化为单行,则变为:

perl -ne 'print if m/Wed Nov 25 23:08:01 GMT 2015/ .. /Wed Nov 25 23:59:24 GMT 2015/'

注意 - 它进行基于文本的匹配,而不是数字匹配(与正则表达式一样)。可以转换这些日期并使用基于时间的。

你可以这样进行数值计算:

#!/usr/bin/env perl
use strict;
use warnings;
use Time::Piece;

my $start = Time::Piece->strptime( 'Nov 25 23:00:00 GMT 2015',
    '%b %d %H:%M:%S GMT %Y' );
my $end = Time::Piece->strptime( 'Nov 25 23:59:00 GMT 2015',
    '%b %d %H:%M:%S GMT %Y' );

my $last_timestamp;
while ( my $line = <DATA> ) {
    chomp($line);
    my $timestamp =
        eval { Time::Piece->strptime( $line, '%a %b %d %H:%M:%S GMT %Y' ) };
    $timestamp //= $last_timestamp;
    if ( $timestamp > $start and $timestamp < $end ) { 
        print $line,"\n";
    }
    $last_timestamp = $timestamp;
}

__DATA__
[...]
abc
abc
abc
Wed Nov 25 23:08:01 GMT 2015
def
def
def
def
... (1000 lines with def)
Wed Nov 25 23:59:24 GMT 2015
xyz
xyz
xyz
[...]

(注意 - 日期与您的输入不按字符串匹配 - 我们将它们解析为数值,并在范围内检查)。

相关内容