159 votes

Comment grep un fichier texte contenant des données binaires?

retourne grep

Fichier binaire test.log correspond

Par exemple

 echo "line1 re \x00\r\nline2\r\nline3 re\r\n" > test.log 
grep re test.log
 

Je souhaite que le résultat montrera line1 et line3 (deux lignes au total).

Est-il possible d'utiliser tr convertir les données non imprimables en données lisibles, pour permettre à grep de fonctionner à nouveau?

156voto

James Selvakumar Points 393
 grep -a
 

Ça ne peut pas être plus simple que ça.

104voto

paxdiablo Points 341644

Une façon est de simplement traiter les fichiers binaires en tant que texte de toute façon, avec grep --text mais cela peut résultat en binaire de l'information envoyé à votre terminal. Ce n'est pas vraiment une bonne idée si vous utilisez un terminal qui interprète le flux de sortie (tels que VT/DEC ou beaucoup d'autres).

Alternativement, vous pouvez cat votre dossier par tr avec la commande suivante:

cat test.log | tr '[\000-\011\013-\037\177-\377]' '.' | grep whatever

Cela va changer quoi que ce soit à moins d'un caractère espace (à l'exception de retour à la ligne) et quelque chose de plus grand que 126, en . caractère, ne laissant que les printables.


Si vous voulez tous les "illégaux" caractère remplacé par un autre, vous pouvez utiliser quelque chose comme le programme C suivant, un classique de l'entrée standard de filtre:

#include<stdio.h>
int main (void) {
    int ch;
    while ((ch = getchar()) != EOF) {
        if ((ch == '\n') || ((ch >= ' ') && (ch <= '~'))) {
            putchar (ch);
        } else {
            printf (" {{%02x}} ", ch);
        }
    }
    return 0;
}

Cela vous donnera {{NN}}NN est le code hexadécimal du caractère et avec un espace de chaque côté. Vous pouvez régler simplement l' printf quelque soit la sortie que vous voulez.

39voto

moodywoody Points 1281

Vous pouvez utiliser des "chaînes" pour extraire des chaînes d'un fichier binaire, par exemple

 strings binary.file | grep foo
 

21voto

alberge Points 2771

Vous pouvez forcer grep à regarder les fichiers binaires avec:

 grep --binary-files=text
 

Vous voudrez peut-être aussi ajouter -o ( --only-matching ) pour ne pas avoir des tonnes de charabia binaire qui feraient sauter votre terminal.

18voto

Steven Penny Points 18523

J'étais tellement heureux quand j'ai compris cela! C'est vraiment la meilleure option à mon avis. Vous n'avez pas à utiliser strings ou tr , car avec cat -v , même les données binaires sont une "chaîne". Excellent!

 $ printf "line1 re \x00\r\nline2\r\nline3 re\r\n" > test.log

$ cat -v test.log | grep re
line1 re ^@^M
line3 re^M
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X