Come posso passare da un file binario all'altro come testo?


76

Ho file binari che dovrebbero essere di testo (sono registri esportati), ma non riesco ad aprirlo con meno (sembra brutto - sembra un file binario). Ho scoperto che potrei aprirlo con vi e posso cat (vedrai i registri effettivi), ma quello che mi piacerebbe davvero fare è grep attraverso di loro (senza dover aprire ciascuno con vi e quindi eseguire una ricerca). C'è un modo per farlo?



11
Ci hai provato grep -a?
quanta,

Risposte:


85

Puoi grepcomunque utilizzare la ricerca nel file: non importa se il file di input è davvero di testo o meno. Da 'man 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.

Si prega di contrassegnare le parole di cautela alla fine del secondo paragrafo. Potresti voler reindirizzare i risultati da grep in un nuovo file ed esaminarlo con vi / less.


grep non funziona davvero. prova grep su un dispositivo di archiviazione. finirà la memoria. ha un meccanismo di buffering interno rotto che dipende da linee di lunghezza ragionevole.
user239558

41

Inseriscilo strings, che eliminerà tutto il codice binario lasciando solo il testo.


stringsapparentemente non capisce che utf-8 è testo.
Javier,

6

Dare bgrepuna prova. ( versione originale / fork più recente )


Penso che questa sia la migliore risposta qui. È così fastidioso vedere cattive implementazioni della ricerca binaria come qui commandlinefu.com/commands/matching/grep-binary/… dove la fuga \xnon funziona davvero come qui grep -P "\x05\x00\xc0" mybinaryfile.
Léo Léopold Hertz

Corro bgrep "fafafafa" test_27.6.2015.bin |lessma ottengo test_27.6.2015.bin: 00005ee4 . Immaginerei di ottenere Fafafafa , poiché stavo cercando questo. Nessun manuale nell'uomo. Qualche idea sul perché un tale risultato?
Léo Léopold Hertz

Ho aperto un nuovo thread sul funzionamento del bgrep qui stackoverflow.com/q/31135561/54964
Léo Léopold Hertz 준영

qual è la differenza grep -a?
rubo77,

Sfortunatamente, bash: bgrep: command not found...e No package bgrep available.

5

Puoi usare questi tre comandi:

  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>


il tr non sembra funzionare sul mio box solaris 10. Test semplice: echo -e 'x \ ty' | tr '[\ 000- \ 011 \ 013- \ 037 \ 177- \ 377]' '.' non traduce la scheda.
user55570,

1

A partire da Grep 2.21, i file binari vengono trattati in modo diverso :

Durante la ricerca di dati binari, grep ora può trattare i byte non testuali come terminatori di riga. Questo può aumentare significativamente le prestazioni.

Quindi quello che succede ora è che con i dati binari, tutti i byte non testuali (comprese le nuove righe) vengono trattati come terminatori di riga. Se si desidera modificare questo comportamento, è possibile:

  • utilizzare --text. Ciò garantirà che solo le nuove righe siano terminatori di linea

  • usare --null-data. Ciò garantirà che solo i byte null siano terminatori di riga

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.