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

评论

serverfault.com/questions/51477/…

您尝试过grep -a吗?

stackoverflow.com/questions/9988379/…

#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。这将确保只有空字节是行终止符