Una forma es simplemente tratar los archivos binarios como texto de todos modos, grep --textpero esto puede resultar en que se envíe información binaria a su terminal. Eso no es realmente una buena idea si está ejecutando un terminal que interpreta el flujo de salida (como VT / DEC o muchos otros).
Alternativamente, puede enviar su archivo trcon el siguiente comando:
tr '[\000-\011\013-\037\177-\377]' '.' <test.log | grep whatever
Esto cambiará cualquier carácter menor que un espacio (excepto una nueva línea) y algo mayor que 126, en un .carácter, dejando solo los imprimibles.
Si desea que cada carácter "ilegal" sea reemplazado por uno diferente, puede usar algo como el siguiente programa en C, un filtro de entrada estándar clásico:
#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;
}
Esto le dará {{NN}}dónde NNestá el código hexadecimal del personaje. Simplemente puede ajustar el printfpara cualquier estilo de salida que desee.
Puede ver ese programa en acción aquí, donde:
pax$ printf 'Hello,\tBob\nGoodbye, Bob\n' | ./filterProg
Hello,{{09}}Bob
Goodbye, Bob