2013-01-03 51 views
20

我正在生成二進制數據文件,這些文件只是一系列連接在一起的記錄。每條記錄都包含一個(二進制)標頭,後跟二進制數據。在二進制頭中有一個ASCII字符串,長度爲80個字符。在這個過程中,我編寫文件的過程有點搞砸,我試圖通過檢查每條記錄的實際長度來調試這個問題。「grep」從二進制文件中偏移ascii字符串

This似乎非常相關,但我不明白Perl,所以我一直無法得到公認的答案在那裏工作。另一個答案指向我已經編譯的bgrep,但它要我給它一個十六進制字符串,我寧願有一個工具,我可以給它ascii字符串,它會在二進制數據中找到它,print字符串和它發現的字節偏移量。

換句話說,我在尋找一些工具,它的作用是這樣的:

tool foobar filename 

tool foobar < filename 

,其輸出是這樣的:

foobar:10 
foobar:410 
foobar:810 
foobar:1210 
... 

例如在匹配開始的文件中匹配的字符串和字節偏移量。在這個例子中,我可以推斷每條記錄的長度是400字節。

其他制約因素:

  • 通過正則表達式搜索能力是很酷,但我並不需要它對於這個問題
  • 我的二進制文件都是大(3.5GB),所以我想如果可能,避免將整個文件讀入內存。
+0

argv的!我不知道我對英語語法的掌握在什麼時候陷入了泥潭。感謝您爲我修復@Kevin – mgilson

回答

23

您可以使用strings此:

strings -a -t x filename | grep foobar 

測試了GNU binutils的。

例如,當在不/bin/ls發生--help

strings -a -t x /bin/ls | grep -- --help 

輸出:每個匹配線的

14938 Try `%s --help' for more information. 
162f0  --help  display this help and exit 
+3

我最終使用'strings -a -t d filename | grep foobar'以十進制而不是十六進制寫輸出。否則,很好的答案,似乎可以用於不同的'grep'口味。 – mgilson

22
grep --byte-offset --only-matching --text foobar filename 

--byte-offset選項輸出的偏移。

--only-matching選項使它爲每個匹配實例打印偏移量,而不是每個匹配行。

--text選項使grep將二進制文件視爲文本文件。

可以縮短到:

grep -oba foobar filename 

它工作在GNU版本的grep,它默認自帶的Linux操作系統。它不會在BSD grep中工作(默認情況下,它隨Mac一起提供)。

+0

我試過了,它說的是:'二進制文件文件名匹配'。我的系統是Ubuntu Linux,'grep --version'給出:「GNU grep 2.5.2」 – mgilson

+1

嘗試添加'-a'選項將二進制文件作爲文本處理 –

+0

乾杯,工作(使用'-a')。 +1。 – mgilson

0

我想做同樣的事情。雖然字符串| grep工作,我發現gsar是我需要的工具。

http://tjaberg.com/

輸出看起來像:

>gsar.exe -bic -sfoobar filename.bin 
filename.bin: 0x34b5: AAA foobar BBB 
filename.bin: 0x56a0: foobar DDD 
filename.bin: 2 matches found