मैं द्विआधारी फ़ाइलों के माध्यम से कैसे ग्रिप करता हूं जो पाठ की तरह दिखते हैं?


76

मेरे पास बाइनरी फाइलें हैं जो पाठ होनी चाहिए (वे लॉग्स निर्यात की जाती हैं), लेकिन मैं इसे कम के साथ नहीं खोल सकता (यह बदसूरत दिखता है - यह एक बाइनरी फ़ाइल जैसा दिखता है)। मैंने पाया कि मैं इसे vi के साथ खोल सकता हूं और मैं इसे कैट कर सकता हूं (आप वास्तविक लॉग देख सकते हैं), लेकिन जो मैं वास्तव में करना चाहता हूं वह उनके माध्यम से grep है (vi के साथ प्रत्येक को खोलने के बिना और फिर प्रदर्शन करना एक खोज)। क्या मेरे लिए ऐसा करने का कोई तरीका है?



11
क्या आपने कोशिश की grep -a?
क्वांटा

जवाबों:


85

आप grepफ़ाइल के माध्यम से खोजने के लिए वैसे भी उपयोग कर सकते हैं - यह वास्तव में परवाह नहीं करता है कि इनपुट फ़ाइल वास्तव में पाठ है या नहीं। 'मैन ग्रीप' से:

    -a, --text
          Process a binary file as if it were text; this is equivalent to the --binary-files=text option.

   --binary-files=TYPE
          If  the  first few bytes of a file indicate that the file contains binary data, assume that the file is
          of type TYPE.  By default, TYPE is binary, and grep normally outputs either a one-line  message  saying
          that a binary file matches, or no message if there is no match.  If TYPE is without-match, grep assumes
          that a binary file does not match; this is equivalent  to  the  -I  option.   If  TYPE  is  text,  grep
          processes  a  binary  file  as  if  it  were  text; this is equivalent to the -a option.  Warning: grep
          --binary-files=text might output binary garbage, which can have nasty side effects if the output  is  a
          terminal and if the terminal driver interprets some of it as commands.

कृपया दूसरे पैराग्राफ के अंत में सावधानी के शब्दों को चिह्नित करें। आप एक नई फ़ाइल में grep से परिणामों को पुनर्निर्देशित करना चाहते हैं और vi / कम के साथ इसकी जांच कर सकते हैं।


grep वास्तव में काम नहीं करता है। स्टोरेज डिवाइस पर grep आज़माएं। यह स्मृति से बाहर चलेगा। इसमें एक टूटी हुई आंतरिक बफरिंग तंत्र है जो उचित लंबाई लाइनों पर निर्भर करता है।
user239558

41

इसके माध्यम से पाइप करें strings, जो बाइनरी कोड के सभी पाठ को छोड़ देगा।


stringsस्पष्ट रूप से utf-8 पाठ नहीं है।
जेवियर

6

दे दो bgrepएक कोशिश। ( मूल रिलीज / अधिक हालिया कांटा )


मुझे लगता है कि यह यहां सबसे अच्छा जवाब है। यहाँ बाइनरी सर्च के बुरे क्रियान्वयन को देखना इतना कष्टप्रद है जैसे कि कमांडलाइनफ्यू / कॉमैंड्स/matching/grep- binary/… जहां द्वारा भागने से \xवास्तव में यहां काम नहीं होता है grep -P "\x05\x00\xc0" mybinaryfile
लेओ लेपोल्ड हर्ट्ज़ o

मैं दौड़ता हूं bgrep "fafafafa" test_27.6.2015.bin |lessलेकिन test_27.6.2015.bin: 00005ee4 प्राप्त करता हूं । मुझे लगता है कि मैं इसे खोज रहा था, क्योंकि मुझे फ़ाफ़्फ़ा मिलेगा । आदमी में कोई मैनुअल नहीं। किसी भी विचार क्यों इस तरह के एक उत्पादन?
लेओ लेपोल्ड हर्ट्ज़ '

मैंने यहाँ bgrep के कामकाज के बारे में एक नया सूत्र खोला stackoverflow.com/q/31135561/54964
Léo Léopold Hertz

क्या अंतर है grep -a?
रूडो77

दुर्भाग्य से, bash: bgrep: command not found...और No package bgrep available

5

आप इन तीन आदेशों का उपयोग कर सकते हैं:

  1. grep -a <sth> file.txt

  2. cat -v file.txt | grep <sth>

  3. cat file.txt | tr '[\000-\011\013-\037\177-\377]' '.' | grep <sth>


tr मेरे सोलारिस 10 बॉक्स पर काम नहीं करता है। सरल परीक्षण: इको-x x \ ty ’| tr '[\ 000- \ 011 \ 013- \ 037 \ 177- \ 377]' '।' ' टैब का अनुवाद नहीं करता है।
user55570

1

ग्रेप 2.21 के साथ शुरू, बाइनरी फ़ाइलों को अलग तरीके से व्यवहार किया जाता है :

बाइनरी डेटा की खोज करते समय, grep अब गैर-टेक्स्ट बाइट्स को लाइन टर्मिनेटर के रूप में मान सकता है। यह प्रदर्शन को काफी बढ़ा सकता है।

तो अब क्या होता है बाइनरी डेटा के साथ, सभी गैर-पाठ बाइट्स (न्यूलाइन सहित) को लाइन टर्मिनेटर के रूप में माना जाता है। यदि आप इस व्यवहार को बदलना चाहते हैं, तो आप कर सकते हैं:

  • उपयोग करें --text। यह सुनिश्चित करेगा कि केवल नई लाइनें लाइन टर्मिनेटर हैं

  • उपयोग करें --null-data। यह सुनिश्चित करेगा कि केवल नल बाइट्स लाइन टर्मिनेटर हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.