我有一些二进制文件,应该是文本文件(它们是导出的日志),但是我不能用更少的文件打开它(看起来很丑-它看起来像一个二进制文件)。我发现可以用vi打开它,也可以用它打开目录(您会看到实际的日志),但是我真正想做的是通过它们进行grep(而不必使用vi打开每个窗口,然后执行搜索)。我有办法吗?
#1 楼
无论如何,您都可以使用grep
来搜索文件-它并不在乎输入文件是否为纯文本。摘自'man grep': -a, --text
Process a binary file as if it were text; this is equivalent to the --binary-files=text option.
--binary-files=TYPE
If the first few bytes of a file indicate that the file contains binary data, assume that the file is
of type TYPE. By default, TYPE is binary, and grep normally outputs either a one-line message saying
that a binary file matches, or no message if there is no match. If TYPE is without-match, grep assumes
that a binary file does not match; this is equivalent to the -I option. If TYPE is text, grep
processes a binary file as if it were text; this is equivalent to the -a option. Warning: grep
--binary-files=text might output binary garbage, which can have nasty side effects if the output is a
terminal and if the terminal driver interprets some of it as commands.
请在第二段结尾处标记警告词。您可能希望将结果从grep重定向到一个新文件,并使用vi / less进行检查。
评论
grep确实不起作用。在存储设备上尝试grep。它将耗尽内存。它具有中断的内部缓冲机制,该机制取决于合理的长度线。
–user239558
17年12月22日在19:13
#2 楼
通过strings
传递它,这将去除所有二进制代码,仅保留文本。评论
字符串显然不明白utf-8是文本。
–哈维尔
17年11月9日在22:47
#3 楼
试试bgrep
。 (原始发行版/最新的fork)评论
我认为这是最好的答案。令人讨厌的是看到二进制搜索的错误实现,例如:commandlinefu.com/commands/matching/grep-binary / ...,其中\ x的转义实际上并不像这里那样grep -P“ \ x05 \ x00 \ xc0” mybinaryfile 。
–LéoLéopoldHertz준영
15年6月30日在10:05
我运行bgrep“ fafafafa” test_27.6.2015.bin | less,但得到test_27.6.2015.bin:00005ee4。我会假设得到fafafafa,因为我一直在搜索。没有人的手册。知道为什么会这样输出吗?
–LéoLéopoldHertz준영
15年6月30日在10:08
我在这里打开了一个有关bgrep功能的新线程stackoverflow.com/q/31135561/54964
–LéoLéopoldHertz준영
15年6月30日在10:18
与grep -a有什么区别?
–rubo77
16年7月2日在2:35
不幸的是,没有bash:bgrep:命令...并且没有可用的软件包bgrep。
–user145545
17-4-14在6:12
#4 楼
您可以使用以下三个命令:grep -a <sth> file.txt
cat -v file.txt | grep <sth>
cat file.txt | tr '[q4312079q0-13-77-7]' '.' | grep <sth>
评论
tr似乎无法在我的solaris 10机器上使用。简单测试:echo -e'x \ ty'| tr'[\ 000- \ 011 \ 013- \ 037 \ 177- \ 377]''。不翻译标签。
–user55570
15年6月27日在22:31
#5 楼
从Grep 2.21开始,二进制文件的处理方式有所不同:搜索二进制数据时,grep现在可以将非文本字节视为行
终止符。这样可以大大提高性能。
所以现在发生的是,对于二进制数据,所有非文本字节
(包括换行符)都被视为行终止符。如果要更改此行为
,则可以:
使用
--text
。这将确保仅换行符是行终止符使用
--null-data
。这将确保只有空字节是行终止符
评论
serverfault.com/questions/51477/…您尝试过grep -a吗?
stackoverflow.com/questions/9988379/…