
매우 큰 텍스트 파일(약 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