grep返回
Binary file test.log matches
例如
echo "line1 re \x00\r\nline2\r\nline3 re\r\n" > test.log # in zsh
echo -e "line1 re \x00\r\nline2\r\nline3 re\r\n" > test.log # in bash
grep re test.log
Run Code Online (Sandbox Code Playgroud)
我希望结果显示line1和line3(总共两行).
是否可以使用tr将不可打印的数据转换为可读数据,让grep再次工作?
Jam*_*mar 100
grep -a
Run Code Online (Sandbox Code Playgroud)
它不能比这更简单.
pax*_*blo 90
一种方法是简单地将二进制文件视为文本,grep --text但这可能会导致二进制信息被发送到您的终端.如果您正在运行解释输出流的终端(例如VT/DEC或许多其他终端),那么这不是一个好主意.
或者,您可以tr使用以下命令发送文件:
tr '[\000-\011\013-\037\177-\377]' '.' <test.log | grep whatever
Run Code Online (Sandbox Code Playgroud)
这会将任何小于空格字符(换行符除外)和任何大于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;
}
Run Code Online (Sandbox Code Playgroud)
这将给你{{NN}},NN角色的十六进制代码在哪里.您可以简单地调整所需printf的任何输出样式.
你可以看到这个程序在这里运行,它在哪里:
pax$ printf 'Hello,\tBob\nGoodbye, Bob\n' | ./filterProg
Hello,{{09}}Bob
Goodbye, Bob
Run Code Online (Sandbox Code Playgroud)
vie*_*tti 66
您可以通过cat -v例如运行数据文件
$ cat -v tmp/test.log | grep re
line1 re ^@^M
line3 re^M
Run Code Online (Sandbox Code Playgroud)
然后可以进一步后处理以删除垃圾; 这与您关于使用tr任务的查询最相似.
moo*_*ody 33
例如,您可以使用"strings"从二进制文件中提取字符串
strings binary.file | grep foo
Run Code Online (Sandbox Code Playgroud)
A B*_*A B 19
您可以强制grep查看二进制文件:
grep --binary-files=text
Run Code Online (Sandbox Code Playgroud)
你可能还想添加-o(--only-matching),这样你就不会得到大量的二进制乱码,这会使你的终端烦恼.
| 归档时间: |
|
| 查看次数: |
112364 次 |
| 最近记录: |