Uma maneira é simplesmente tratar os arquivos binários como texto de qualquer maneira, com grep --text
mas isso pode muito bem resultar no envio de informações binárias ao seu terminal. Isso não é realmente uma boa ideia se você estiver executando um terminal que interpreta o fluxo de saída (como VT / DEC ou muitos outros).
Como alternativa, você pode enviar seu arquivo tr
com o seguinte comando:
tr '[\000-\011\013-\037\177-\377]' '.' <test.log | grep whatever
Isso mudará qualquer coisa menor que um caractere de espaço (exceto nova linha) e qualquer coisa maior que 126 em um .
caractere, deixando apenas os imprimíveis.
Se quiser que cada caractere "ilegal" seja substituído por um diferente, você pode usar algo como o seguinte programa C, um filtro de entrada padrão clássico:
#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;
}
Isso lhe dará {{NN}}
, onde NN
está o código hexadecimal para o personagem. Você pode simplesmente ajustar o printf
para qualquer estilo de saída que desejar.
Você pode ver esse programa em ação aqui, onde:
pax$ printf 'Hello,\tBob\nGoodbye, Bob\n' | ./filterProg
Hello,{{09}}Bob
Goodbye, Bob