2011-07-04 9 views
4

제목에서 알 수 있듯이 이진 문자열의 경우 합리적으로 큰 (약 100MB) 이진 파일을 grep하고 싶습니다.이 바이너리 문자열은 5K 미만입니다.더 큰 바이너리 파일에서 큰 바이너리 값을위한 grepping

-P 옵션을 사용하여 grep을 시도했지만 패턴이 단지 몇 바이트 일 때만 일치하는 것으로 표시됩니다. 약 100 바이트까지 올라가면 더 이상 일치하는 것이 없습니다.

나는 또한 bgrep을 시도했습니다. 그러나 이것은 원래 잘 작동했지만, 패턴을 길이로 확장해야 할 때 "잘못된/빈 검색 문자열"오류가 발생했습니다.

아이러니하게도, Windows에서 HxD를 사용하여 파일을 검색 할 수 있으며 인스턴스에서 찾을 수 있습니다. 내가 정말로 필요한 것은 리눅스 커맨드 라인 툴이다. 당신의 도움에 대한

감사합니다,

사이먼

+0

검색 패턴에 대한 자세한 정보가 필요합니다. perl -P는 펄 스타일의 정규 표현식을 기대합니다. 그게 니가 원하는거야? AFAICT HxD는 정규 표현식을 전혀 지원하지 않습니다 ... – sehe

+0

. -P는 grep이 나에게 맞는 바이너리를 찾기 위해 과거에 사용했던 것입니다. 나는 reg-ex에 대해별로 신경 쓰지 않는다. 난 그냥 파일의 숫자에 걸쳐 크고 정적 이진 패턴을 찾아야합니다. – Simon

답변

0

바이너리로 파일을 취급 grep -U를 사용해보십시오.

또한 검색 패턴을 어떻게 지정합니까? 쉘 매개 변수 확장에서 생존하기 위해 도망 치기 만하면됩니다.

+0

현재 grep -U -P "\ xE1 \ x01 \ x08 \ x73 \ xE3 \ x03 ...."bigfile을 사용 중입니다. 어떻게 내가 탈출을 할 것인가? 또한 grep이 파일에서 패턴을 읽는 방법이 있습니까? 나는 -f를 시도했으나 효과가 없었다. 감사. – Simon

0

간단한 파이썬 스크립트를보고 싶을 것입니다.

match= (b"..." 
    b"...." 
    b"...") # Some byte string literal of immense proportions 
with open("some_big_file","rb") as source: 
    block= read(len(match)) 
    while block != match: 
     byte= read(1) 
     if not byte: break 
     block= block[1:]+read(1) 

이것은 Linux와 Windows에서 안정적으로 작동합니다.

2

두 개의 큰 바이너리 데이터 파일이 있다고 가정 해보십시오. 일치하지 않아야하는 큰 파일의 경우 내용이 모두 NUL 바이트 인 100MB 파일을 만듭니다.

dd ibs=1 count=100M if=/dev/zero of=allzero.dat

우리가 일치하고 싶은 경우, 백 임의 메가 바이트를 만듭니다.

#! /usr/bin/env perl 

use warnings; 

binmode STDOUT or die "$0: binmode: $!"; 

for (1 .. 100 * 1024 * 1024) { 
    print chr rand 256; 
} 

./mkrand >myfile.dat으로 실행하십시오.

마지막으로 일치 항목을 pattern이라는 파일로 추출하십시오.

dd skip=42 count=10 if=myfile.dat of=pattern

난 당신이 일치하는 파일 만 (-l)을 원하고 당신의 패턴 (-F 또는 --fixed-strings) 문자 그대로 처리 할 가정합니다. 길이 제한에 따라 -P으로 출근 한 것으로 의심됩니다.

당신은 --file=PATTERN-FILE 옵션을 사용하도록 유혹 할 수 있지만, 당신은 인코딩 문제를 칠 것이다 당신의 5킬로바이트 패턴이 개행 문자가 들어있는 가능성이 경우에, 그래서 grep은 줄 바꿈으로 구분 된 패턴으로 PATTERN-FILE의 내용을 해석 .

시스템의 ARG_MAX이 충분히 커서 pattern의 내용을 인용하십시오. 예 :

$ grep -l --fixed-strings "$(cat pattern)" allzero.dat myfile.dat 
myfile.dat
관련 문제