수천 줄의 파일이 있습니다. 한 줄에서 다른 줄로 이동하여 이 줄 사이에 있는 모든 항목을 포함해야 합니다.
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
[...]
(참고 - 날짜는 입력한 문자열과 일치하지 않습니다. 숫자 값으로 구문 분석하고 범위 내에서 확인합니다.)