역방향 가져오기

역방향 가져오기

매우 큰 텍스트 파일(약 10,000,000줄)이 있다고 가정해 보겠습니다. grep끝부터 시작하여 결과를 파일에 저장해야 합니다 . 작업을 완료하는 가장 효율적인 방법은 무엇입니까?

답변1

음식물/grep해결책

tac file | grep whatever

또는 더 효율적으로:

grep whatever < <(tac file)

500MB 파일 처리 시간:

real    0m1.225s
user    0m1.164s
sys     0m0.516s

sed/grep해결책:

sed '1!G;h;$!d' | grep whatever

500MB 파일 처리 시간: 10분 이상 경과 후 중단되었습니다.

awk/grep해결책:

awk '{x[NR]=$0}END{while (NR) print x[NR--]}' file | grep whatever

500MB 파일 처리 시간:

real    0m5.626s
user    0m4.964s
sys     0m1.420s

펄/그렙해결책:

perl -e 'print reverse <>' file | grep whatever

500MB 파일 처리 시간:

real    0m3.551s
user    0m3.104s
sys     0m1.036s

답변2

이 솔루션이 도움이 될 수 있습니다.

tac file_name | grep -e expression

답변3

이것은 첫 번째 일치 항목을 찾자마자 종료됩니다.

 tac hugeproduction.log | grep -m1 WhatImLookingFor

아래에는 처음 두 게임 전후의 5줄이 나와 있습니다.

 tac hugeproduction.log | grep -m2 -A 5 -B 5 WhatImLookingFor

-i꼭 필요한 경우가 아니면 (대소문자 구분 안 함)을 사용하지 마십시오 . grep 속도가 느려질 수 있습니다.

찾고 있는 정확한 문자열을 알고 있다면 fgrep(고정 문자열)을 고려해보세요.

 tac hugeproduction.log | grep -F -m2 -A 5 -B 5 'ABC1234XYZ'

답변4

파일이 정말 크고 메모리에 맞지 않으면 다음 Perl과 같이 사용합니다.파일::뒤로 읽기모듈 CPAN:

$ cat reverse-grep.pl
#!/usr/bin/perl

use strict;
use warnings;

use File::ReadBackwards;

my $pattern = shift;
my $rev = File::ReadBackwards->new(shift)
    or die "$!";

while (defined($_ = $rev->readline)) {
    print if /$pattern/;
}

$rev->close;

그 다음에:

$ ./reverse-grep.pl pattern file

관련 정보