web-dev-qa-db-fra.com

Comment puis-je utiliser 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 (il a l'air moche - il ressemble à un fichier binaire). J'ai trouvé que je pouvais l'ouvrir avec vi et je peux le chat (vous verrez les journaux réels), mais ce que j'aimerais vraiment faire, c'est les parcourir (sans avoir à ouvrir chacun avec vi et ensuite effectuer une recherche). Y a-t-il un moyen pour moi de faire ça?

76
Robyn Smith

Vous pouvez utiliser grep de toute façon pour rechercher dans le fichier - peu importe si le fichier d'entrée est vraiment du texte ou non. De '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.

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

85
Axel Knauf

Dirigez-le par strings, ce qui supprimera tout le code binaire en ne laissant que le texte.

41
Mike Scott
6
quanta

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
MLSC

Depuis Grep 2.21, les fichiers binaires sont traités différemment :

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

Donc, ce qui se passe maintenant, c'est qu'avec les données binaires, tous les octets non textuels (y compris les sauts de ligne) sont traités comme des terminateurs de ligne. Si vous souhaitez modifier ce 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
Steven Penny