题 如何通过看起来像文本的二进制文件?


我有二进制文件,应该是文本(它们是导出的日志),但我不能用更少的打开它(它看起来很难看 - 它看起来像一个二进制文件)。我发现我可以用vi打开它,我可以捕捉它(你会看到实际的日志),但我真正喜欢的是通过它们(不必用vi打开每一个然后执行)搜索)。有没有办法让我这样做?


76
2017-11-05 15:03




serverfault.com/questions/51477/... - quanta
你试过了吗 grep -a? - quanta
stackoverflow.com/questions/9988379/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


答案:


您可以使用 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进行检查。


85
2017-11-05 15:48



grep并没有真正起作用。尝试在存储设备上使用grep。它将耗尽内存。它有一个破碎的内部缓冲机制,依赖于合理的长度线。 - user239558


管它通过 strings,它将删除所有二进制代码,只留下文本。


41
2017-11-05 15:09



好主意,谢谢:) [不是OP] - Karel Bílek
strings 显然不明白utf-8是文字。 - Javier


bgrep 一试。 (原始版本 / 更近期的叉子


6
2017-11-05 16:07



我认为这是最好的答案。看到像这里的二进制搜索的糟糕实现是如此烦人 commandlinefu.com/commands/matching/grep-binary/... 逃跑的地方 \x 不是真的像这里一样工作 grep -P "\x05\x00\xc0" mybinaryfile。 - Léo Léopold Hertz 준영
我跑 bgrep "fafafafa" test_27.6.2015.bin |less 但得到 test_27.6.2015.bin:00005ee4。我会假设得到 fafafafa因为我正在搜索这个。男人没有手册。知道为什么这么输出? - Léo Léopold Hertz 준영
我在这里开了一个关于bgrep功能的新帖子 stackoverflow.com/q/31135561/54964 - Léo Léopold Hertz 준영
有什么区别 grep -a? - rubo77
不幸, bash: bgrep: command not found... 和 No package bgrep available。 - jww


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

  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>


5
2018-06-17 10:43



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


从Grep 2.21开始,二进制文件是 对待不同

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

那么现在发生的是二进制数据,所有非文本字节 (包括换行符)被视为行终止符。如果你想改变这个 行为,你可以:

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

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


1
2017-07-18 00:19