grep返回
二进制文件test.log匹配
例如
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
我希望结果显示第一行和第三行(共两行)。
是否可能使用tr
将无法打印的数据转换为可读数据,以便再次使用grep?
grep返回
二进制文件test.log匹配
例如
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
我希望结果显示第一行和第三行(共两行)。
是否可能使用tr
将无法打印的数据转换为可读数据,以便再次使用grep?
grep -a
再简单不过了。
LC_ALL="C" grep -a
。 - Chris Stratton一种方法是使用 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
tr '[:cntrl:] '.'
更好。而且在你的 tr 语法中应该是 \000-\010\013\014\016-\037\177-\377'
。 - Daniel YC Lintr '[\000-\010\013\014\016-\037\177-\377]' '_'
是可行的,但控制字符不适用于我的情况。 - Daniel YC Lingrep --text
导入管道中的 tr
来省略掉 cat
步骤。这样还可以在多个文件中进行搜索,并在输出结果中保留文件名。 - aaaantoine您可以通过cat -v
运行数据文件,例如:
$ cat -v tmp/test.log | grep re
line1 re ^@^M
line3 re^M
这可以进一步进行后处理以去除垃圾;这类似于您有关使用 tr
的查询。
-v
只是告诉 cat
显示非打印字符。
-v,--show-nonprinting
,使用^和M-符号表示非打印字符,但不包括换行符和制表符。 - tommy.carstensenset | cat -v | grep variable
- funrollgrep --text
并非总是有效,它将 CTRL+D 解释为文件终止符。因此,如果您的二进制文件中包含该字符,grep 将提前退出。 - Tommystrings binary.file | grep foo
你可以使用以下命令让grep查看二进制文件:
grep --binary-files=text
你可能还想要添加 -o
(--only-matching
),这样你就不会得到大量的二进制乱码,这些乱码会破坏你的终端。--only-matching
,并且你的正则表达式不匹配任意二进制数据,那么就不会有问题。 - A B从Grep 2.21开始,二进制文件会有不同的处理方式:
在搜索二进制数据时,grep现在可能将非文本字节视为行终止符。这可以显著提高性能。
因此,对于二进制数据,所有非文本字节(包括换行符)都被视为行终止符。如果想要更改此行为,可以:
使用--text
。这将确保只有换行符是行终止符
使用--null-data
。这将确保只有空字节是行终止符
使用grep -a命令可以强制grep搜索和输出二进制文件。例如:grep -a re test.log
正如James Selvakumar所说,grep -a
可以解决问题。-a或--text强制Grep将输入流处理为文本。
请参阅Manpage http://unixhelp.ed.ac.uk/CGI/man-cgi?grep
试试
cat test.log | grep -a somestring
strings test.log | grep -i
cat yourfilename | tr -cd "[:print:]"
echo
命令中不是缺少了-e
吗? - Sopalajo de Arrierez