Grep de uma linha para uma linha [duplicada]

2

Eu tenho um arquivo com milhares de linhas. Eu preciso de grep de uma linha para outra linha e incluir tudo entre estas linhas

, por exemplo, linhas de Wed Nov 25 23:08:01 GMT 2015 a 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
[...]

Você pode sugerir qual é a expressão grep correta?

    
por Federi 26.11.2015 / 12:47

2 respostas

1

Uma combinação de sed e grep deve fazer o truque. Algo assim:

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

Observe que este exemplo não incluirá as linhas correspondentes às datas, apenas entre elas.

    
por 26.11.2015 / 13:01
1

Não posso sugerir uma expressão grep , porque não é para isso que o grep é válido.

Eu sugeriria usar perl e um operador de intervalo:

#!/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/;
}

Que se for formatado como um forro único:

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

Nota - faz correspondência baseada em texto, não numérica (como no regex). Seria possível converter essas datas e usar a hora com base.

Você poderia fazer numericamente assim:

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

(Nota - as datas não correspondem à sua entrada em sentido literal - estamos analisando-as em valores numéricos e verificando dentro do intervalo).

    
por 26.11.2015 / 18:12

Tags