2013-01-03 20 views
20

Bir araya getirilmiş bir dizi kayıt olan ikili veri dosyaları oluşturuyorum. Her kayıt bir ikili veriden sonra ikili veriden oluşur. İkili başlık içinde 80 karakter uzunluğunda bir ascii dizesidir. Yol boyunca bir yerlerde, dosya yazma sürecim biraz karıştı ve ben her bir kaydın gerçekte ne kadar uzun olduğunu kontrol ederek bu sorunu ayıklamaya çalışıyorum."grep" ikili dosyadan ascii dizesinin ofseti

This son derece ilgili görünüyor, ama ben perl'i anlamıyorum, bu yüzden işe orada kabul edilen cevabı alamadım. Diğer cevap, derlediğim bgrep'u işaret ediyor, ama bunu bir hex dizesiyle beslememi istiyor ve ascii dizesini verebileceğim bir aleti kullanmamı ve bunu ikili verilerde bulabileceğimi düşünüyorum. bulunduğu dizge ve bayt ofseti. Başka bir deyişle

, böyle davranan bazı araç için arıyorum:

tool foobar filename 

veya

tool foobar < filename 

ve çıkış böyle bir şeydir:

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

Örneğin Eşleşen dize ve eşleşmenin başladığı dosyadaki bir bayt ofseti. Bu örnekte, her kaydın 400 bayt uzunluğunda olduğunu söyleyebilirim.

Diğer kısıtlamalar: regex göre aramak için

  • yeteneği serin, ama bu sorun için buna ihtiyacı yoktur
  • , bu yüzden hiç (3.5GB) büyük istiyorum Benim ikili dosyalardır Mümkünse tüm dosyayı hafızaya almamaktan kaçının.
+0

ARGV:

http://tjaberg.com/

çıktı gibi görünüyor! İngiliz dilbilgisi ustalığımın hangi noktaya geldiğini bilmiyorum. Benim için @Kevin – mgilson

cevap

23

Bunun için strings kullanabilirsiniz:

strings -a -t x filename | grep foobar 

GNU binutils ile test edilmiştir. /bin/ls içinde --help meydana Örneğin

:

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

Çıkış:

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

sabitlemek için teşekkürler çünkü 'strings -a -t d dosyaadı kullanarak sona erdi | grep foobar ', çıktıyı onaltılık olarak onaltılık olarak yazmak. Aksi takdirde, 'grep' farklı tatlar ile çalışacak gibi görünüyor büyük bir cevap. – mgilson

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

--byte-offset seçenek baskıların her biri uygun hattının uzaklığı.

--only-matching seçeneği, her eşleşen satır yerine her eşleşen örnek için ofsetin yazdırılmasını sağlar.

--text seçeneği grep'in ikili dosyayı bir metin dosyası olarak ele almasını sağlar.

Bunu için kısaltabilir:

varsayılan olarak linux ile geliyor grep GNU versiyonu, çalışır
grep -oba foobar filename 

. BSD grep'te çalışmayacaktır (varsayılan olarak Mac ile birlikte gelir).

+0

Bunu denedim, hepsi diyor ki: 'İkili dosya dosya adı eşleşir'. Sistemim Ubuntu Linux'tur ve 'grep --version' verir:" GNU grep 2.5.2 " – mgilson

+1

İkili dosyaları –

+0

Şerefe olarak işlemek için' -a' seçeneğini eklemeyi deneyin, (-a ile) çalışır. +1. – mgilson

0

Aynı görevi yapmak istedim. Dizeleri olmasına rağmen | grep işe yaradı, gsarın ihtiyacım olan çok şey olduğunu gördüm.

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