Una forma es simplemente tratar los archivos binarios como texto de todos modos, grep --text
pero 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 tr
con 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 NN
está el código hexadecimal del personaje. Simplemente puede ajustar el printf
para 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