76 votes

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

85voto

WormSlayer Points 31

Vous pouvez utiliser grep de toute façon pour rechercher dans le fichier - il ne se soucie pas vraiment de savoir si le fichier d'entrée est vraiment du texte ou non. Extrait 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 noter les mises en garde à la fin du deuxième paragraphe. Vous pourriez vouloir rediriger les résultats de grep dans un nouveau fichier et l'examiner avec vi / less.

41voto

Mike Scott Points 7853

Passez-le dans le tuyau strings qui supprimera tout le code binaire pour ne laisser que le texte.

6voto

quanta Points 49664

Donnez bgrep un essai. ( version originale / bifurcation plus récente )

5voto

joesdiner Points 333

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>

1voto

Zombo Points 1119

À partir de 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 lignes. ligne. Cela peut améliorer les performances de manière significative.

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 fins de ligne. Si vous voulez changer cela comportement, vous le pouvez :

  • utiliser --text . Cela permet de s'assurer que seules les nouvelles lignes sont des terminaisons de ligne.

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X