2013-01-03 16 views
20

से एएससीआई स्ट्रिंग का ऑफसेट मैं बाइनरी डेटा फाइलें उत्पन्न कर रहा हूं जो कि एक साथ जुड़े रिकॉर्ड की श्रृंखला हैं। प्रत्येक रिकॉर्ड में बाइनरी डेटा के बाद एक (बाइनरी) शीर्षलेख होता है। द्विआधारी शीर्षलेख के भीतर 80 अक्षरों की एक असीसी स्ट्रिंग है। कहीं भी, फाइलों को लिखने की मेरी प्रक्रिया थोड़ा गड़बड़ हो गई और मैं इस समस्या को डीबग करने की कोशिश कर रहा हूं कि प्रत्येक रिकॉर्ड वास्तव में कितना समय है।"grep" बाइनरी फ़ाइल

This बेहद संबंधित लगता है, लेकिन मुझे perl समझ में नहीं आता है, इसलिए मैं काम करने के लिए स्वीकार्य उत्तर प्राप्त करने में सक्षम नहीं हूं। दूसरा उत्तर bgrep को इंगित करता है जिसे मैंने संकलित किया है, लेकिन यह चाहता है कि मैं इसे हेक्स स्ट्रिंग खिलाऊं और मैं सिर्फ एक उपकरण चाहता हूं जहां मैं इसे एसीआई स्ट्रिंग दे सकता हूं और इसे बाइनरी डेटा, प्रिंट में मिलेगा स्ट्रिंग और बाइट ऑफसेट जहां यह पाया गया था।

दूसरे शब्दों में, मैं कुछ उपकरण है जो इस तरह काम करता है के लिए देख रहा हूँ:

tool foobar filename 

या

tool foobar < filename 

और इसके उत्पादन कुछ इस तरह है:

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

जैसे जिस स्ट्रिंग से मेल खाता था और उस फ़ाइल में एक बाइट ऑफ़सेट था जहां मैच शुरू हुआ था। इस उदाहरण के मामले में, मैं अनुमान लगा सकता हूं कि प्रत्येक रिकॉर्ड 400 बाइट लंबा है।

अन्य बाधाओं: रेगुलर एक्सप्रेशन द्वारा खोज करने के लिए

  • क्षमता शांत है, लेकिन मैं इस समस्या के लिए इसकी आवश्यकता नहीं है
  • मेरे बाइनरी फ़ाइलें बड़ा (3.5GB), तो मैं करना चाहते हैं यदि संभव हो तो पूरी फ़ाइल को मेमोरी में पढ़ने से बचें।
+0

argv:

http://tjaberg.com/

उत्पादन की तरह लग रहा है! मुझे नहीं पता कि अंग्रेजी व्याकरण की मेरी निपुणता मिट्टी में फिसल गई है। मेरे लिए यह तय करने के लिए धन्यवाद @ केविन – mgilson

उत्तर

23

आप इस के लिए strings इस्तेमाल कर सकते हैं:

strings -a -t x filename | grep foobar 

जीएनयू 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

मैं 'स्ट्रिंग्स-ए-डी डी फाइलनाम का उपयोग कर समाप्त हुआ। grep foobar' हेक्स के बजाय दशमलव में आउटपुट लिखने के लिए। अन्यथा, ऐसा लगता है कि महान उत्तर 'grep' के विभिन्न स्वादों के साथ काम करेगा। – mgilson

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

--byte-offset विकल्प प्रिंट प्रत्येक मिलान लाइन की ऑफसेट।

--only-matching विकल्प यह प्रत्येक मिलान रेखा के बजाय प्रत्येक मिलान करने के लिए ऑफसेट प्रिंट करता है।

--text विकल्प grep बाइनरी फ़ाइल को टेक्स्ट फ़ाइल के रूप में मानता है।

आप इसे करने के लिए छोटा कर सकते हैं:

grep -oba foobar filename 

यह जो डिफ़ॉल्ट रूप से linux के साथ आता है grep की जीएनयू संस्करण, में काम करता है। यह बीएसडी grep में काम नहीं करेगा (जो डिफ़ॉल्ट रूप से मैक के साथ आता है)।

+0

मैंने यह कोशिश की, यह सब कहता है: 'बाइनरी फ़ाइल फ़ाइल नाम मिलान'। मेरा सिस्टम उबंटू लिनक्स है, और 'grep --version' देता है: "जीएनयू grep 2.5.2" – mgilson

+1

बाइनरी फ़ाइलों को पाठ –

+0

चीयर्स के रूप में इलाज करने के लिए '-a' विकल्प जोड़ने का प्रयास करें, जो काम करता है (' -a' के साथ)। +1। – mgilson

0

मैं एक ही काम करना चाहता था। हालांकि स्ट्रिंग्स | grep काम किया, मैंने पाया कि जीएसआर मुझे बहुत आवश्यक उपकरण था।

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