2011-07-04 44 views
4

正如標題所示,我想grep一個相當大的(大約100MB)二進制文件,對於一個二進制字符串 - 這個二進制字符串剛好在5K以下。從一個更大的二進制文件中刷新一個大的二進制值

我試着grep使用-P選項,但這似乎只返回匹配時模式只有幾個字節 - 當我上升到約100字節它不再發現任何匹配。我也嘗試過bgrep。這原本運作良好,但是,當我需要延長模式的長度,我現在只是「無效/空搜索字符串」錯誤。

具有諷刺意味的是,在Windows中,我可以使用HxD來搜索文件,並在實例中找到它。我真正需要的是一個Linux命令行工具。

感謝您的幫助,

西蒙

+0

我們確實需要更多關於搜索模式的信息。請注意,perl -P需要Perl風格的正則表達式。那真的是你想要的嗎? 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

你可能想看看一個簡單的Python腳本。

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

假設我們有幾個大的二進制數據文件。對於一個不匹配的大文件,我們創建一個100MB的文件,其內容都是NUL字節。

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選項,但grep解釋PATTERN-FILE的內容換行分隔的格局,所以在您5KB模式包含換行符可能的情況下,你會打的編碼問題。

所以,希望你的系統的ARG_MAX足夠大,併爲此付出。請務必引用pattern的內容。例如:

$ grep -l --fixed-strings "$(cat pattern)" allzero.dat myfile.dat 
myfile.dat