한 줄에서 다른 줄로 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

perl대신 and 범위 연산자를 사용하는 것이 좋습니다 .

#!/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
[...]

(참고 - 날짜는 입력한 문자열과 일치하지 않습니다. 숫자 값으로 구문 분석하고 범위 내에서 확인합니다.)

관련 정보