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

76

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 trouvé 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?

Robyn Smith
la source
11
Avez-vous essayé grep -a?
Quanta
1
stackoverflow.com/questions/9988379/…
Ciro Santilli a annoncé le

Réponses:

85

Vous pouvez grepquand même utiliser la recherche dans le fichier - le fait que le fichier d’entrée soit réellement textuel n’a aucune importance. 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.

Axel Knauf
la source
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
41

Transférez-le strings, ce qui supprimera tout le code binaire, ne laissant que le texte.

Mike Scott
la source
stringsapparemment ne comprend pas utf-8 is text.
Javier
6

Donnez bgrepun essai. ( version originale / fourche plus récente )

quanta
la source
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ù l'échappement par \xne 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 |lessmais reçois test_27.6.2015.bin: 00005ee4 . Je supposerais obtenir fafafafa , puisque je cherchais ceci. Pas de manuel chez l'homme. Une idée pourquoi une telle sortie?
Léo Léopold Hertz
J'ai ouvert une nouvelle discussion 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.
5

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>

MLSC
la source
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
1

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

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

Donc, 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 souhaitez modifier ce comportement, vous pouvez:

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

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

Steven Penny
la source