Один из способов - просто обрабатывать двоичные файлы как текст, grep --text
но это вполне может привести к отправке двоичной информации на ваш терминал. Это не очень хорошая идея, если вы используете терминал, который интерпретирует выходной поток (например, VT / DEC или многие другие).
Кроме того, вы можете отправить свой файл tr
с помощью следующей команды:
tr '[\000-\011\013-\037\177-\377]' '.' <test.log | grep whatever
Это превратит все, что меньше пробела (кроме новой строки) и больше 126, в .
символ, оставив только печатные формы.
Если вы хотите, чтобы каждый "недопустимый" символ был заменен другим, вы можете использовать что-то вроде следующей программы на C, классического стандартного входного фильтра:
#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;
}
Это даст вам {{NN}}
, где NN
находится шестнадцатеричный код символа. Вы можете просто настроить printf
любой стиль вывода, который хотите.
Вы можете увидеть эту программу в действии здесь, где она:
pax$ printf 'Hello,\tBob\nGoodbye, Bob\n' | ./filterProg
Hello,{{09}}Bob
Goodbye, Bob