Question Comment puis-je passer des fichiers binaires qui ressemblent à du texte?


J'ai des fichiers binaires qui devraient être du texte (ce sont des journaux exportés), mais je ne peux pas l'ouvrir avec moins (ça a l'air moche - ça ressemble à un fichier binaire). J'ai découvert que je pouvais l'ouvrir avec vi et que je pouvais le chatter (vous verrez les journaux réels), mais ce que j'aimerais vraiment faire, c'est passer par eux (sans avoir à ouvrir chacun d'eux avec vi et ensuite exécuter une recherche). Y a-t-il un moyen pour moi de faire ça?


76
2017-11-05 15:03


origine


serverfault.com/questions/51477/… - quanta
As-tu essayé grep -a? - quanta
stackoverflow.com/questions/9988379/… - Ciro Santilli 新疆改造中心 六四事件 法轮功


Réponses:


Vous pouvez utiliser grep Quoi qu’il en soit, chercher dans le fichier - peu importe que le fichier d’entrée soit réellement du texte ou non. De 'homme 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.

Veuillez marquer les mots d'avertissement à la fin du deuxième paragraphe. Vous voudrez peut-être rediriger les résultats de grep dans un nouveau fichier et l'examiner avec vi / less.


85
2017-11-05 15:48



grep ne fonctionne pas vraiment. essayez grep sur un périphérique de stockage. il va manquer de mémoire. il a un mécanisme de tampon interne brisé qui dépend de lignes de longueur raisonnable. - user239558


Pipe-le à travers strings, qui supprimera tout le code binaire en ne laissant que le texte.


41
2017-11-05 15:09



Excellente idée, merci :) [pas OP] - Karel Bílek
strings apparemment ne comprend pas utf-8 is text. - Javier


Donner bgrep un essai. (version originale / fourche plus récente)


6
2017-11-05 16:07



Je pense que c'est la meilleure réponse ici. Il est tellement ennuyant de voir les mauvaises implémentations de la recherche binaire comme ici commandlinefu.com/commands/matching/grep-binary/… où la fuite par \x ne fonctionne pas vraiment comme ici grep -P "\x05\x00\xc0" mybinaryfile. - Léo Léopold Hertz 준영
je cours bgrep "fafafafa" test_27.6.2015.bin |less mais obtenir test_27.6.2015.bin: 00005ee4. Je supposerais obtenir fafafafa, depuis que je cherchais ceci. Pas de manuel chez l'homme. Une idée pourquoi une telle sortie? - Léo Léopold Hertz 준영
J'ai ouvert un nouveau fil sur le fonctionnement de bgrep ici stackoverflow.com/q/31135561/54964 - Léo Léopold Hertz 준영
quelle est la différence grep -a? - rubo77
Malheureusement, bash: bgrep: command not found... et No package bgrep available. - jww


Vous pouvez utiliser ces trois commandes:

  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>


5
2018-06-17 10:43



le tr ne semble pas fonctionner sur mon solaris 10 box. Test simple: echo -e 'x \ ty' | tr '[\ 000- \ 011 \ 013- \ 037 \ 177- \ 377]' '. ne traduit pas l'onglet. - user55570


À partir de Grep 2.21, les fichiers binaires sont traité différemment:

Lors de la recherche de données binaires, grep peut maintenant traiter les octets non textuels comme des lignes.   terminateurs. Cela peut considérablement améliorer les performances.

Alors qu'est-ce qui se passe maintenant, c'est qu'avec les données binaires, tous les octets non textuels (y compris les nouvelles lignes) sont traités comme des terminateurs de ligne. Si vous voulez changer cela comportement, vous pouvez:

  • utilisation --text. Cela garantira que seules les nouvelles lignes sont des terminateurs de ligne

  • utilisation --null-data. Cela garantira que seuls les octets nuls sont des terminateurs de ligne


1
2017-07-18 00:19