一种方法是简单地把二进制文件为文本,无论如何,与grep --text
但是这很可能导致二进制信息被发送到你的终端。这是不是一个真正的好主意,如果你正在运行解译输出流(如VT/DEC或其他许多人)的终端。
或者,你可以用下面的命令,通过tr
发送文件:
tr '[\000-\011\013-\037\177-\377]' '.' <test.log | grep whatever
这将改变任何小于一个空格字符(除换行符)和任何大于126,为.
人物,留下只有printables。
如果你想每一个“非法”字符被另一个取代,您可以使用类似下面的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
请注意,有一种程序可以从二进制文件中滤除二进制字符,并只保留文本字符(可读)。这里: http://www.soft.tahionic.com/download-words_extractor/index.html – Ampere 2013-05-29 09:01:10
不好意思,但是......你不是在'echo'命令中缺少'-e'吗? – 2014-12-13 00:46:34
如果你使用'zsh',没有-e就没问题。如果你使用'bash',你应该添加'-e'。 – 2014-12-14 03:30:43