Один из способов - просто обрабатывать двоичные файлы как текст в любом случае, с grep --text
, но это может привести к тому, что двоичная информация будет отправлена на ваш терминал. Это не очень хорошая идея, если вы используете терминал, который интерпретирует выходной поток (например, VT / DEC или многие другие).
Кроме того, вы можете отправить файл через tr
со следующим command:
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