Один із способів - просто поводитися з бінарними файлами як текстом у будь-якому випадку, 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