如何在看起来像文本的二进制文件中grep?


76

我有应该是文本的二进制文件(它们是导出的日志),但是我不能用更少的文件打开它(看起来很丑-它看起来像一个二进制文件)。我发现可以用vi打开它,也可以容纳它(您会看到实际的日志),但是我真正想做的是grep通过它们(不必使用vi打开每个文件,然后执行搜索)。我有办法吗?



11
你尝试了grep -a吗?
量子

Answers:


85

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


6

bgrep一试。(原始版本 / 最近的fork


我认为这是最好的答案。看到二进制搜索的错误实现非常令人讨厌,例如:commandlinefu.com/commands/matching/grep-binary/…,其中转义\x实际上并没有像这里那样grep -P "\x05\x00\xc0" mybinaryfile
莱奥波德·赫兹(LéoLéopoldHertz)2015年

我运行bgrep "fafafafa" test_27.6.2015.bin |less但得到test_27.6.2015.bin:00005ee4。我会假设得到fafafafa,因为我一直在搜索它。没有人的手册。知道为什么会这样输出吗?
莱奥列奥波尔德赫兹준 영

我打开了一个新的线程有关bgrep的功能在这里stackoverflow.com/q/31135561/54964
莱奥列奥波尔德·赫兹준 영

有什么区别grep -a
rubo77 '16

不幸的是,bash: bgrep: command not found...No package bgrep available

5

您可以使用以下三个命令:

  1. grep -a <sth> file.txt

  2. cat -v file.txt | grep <sth>

  3. cat file.txt | tr '[\000-\011\013-\037\177-\377]' '.' | grep <sth>


tr似乎在我的solaris 10盒上不起作用。简单测试:echo -e'x \ ty'| tr'[\ 000- \ 011 \ 013- \ 037 \ 177- \ 377]''。不翻译标签。
user55570 2015年

1

从Grep 2.21开始,二进制文件的处理方式有所不同

搜索二进制数据时,grep现在可以将非文本字节视为行终止符。这可以显着提高性能。

所以现在发生的是,对于二进制数据,所有非文本字节(包括换行符)都被视为行终止符。如果要更改此行为,可以:

  • 使用--text。这将确保只有换行符才是行终止符

  • 使用--null-data。这将确保只有空字节是行终止符

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.