一种方法是无论如何都将二进制文件简单地视为文本,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