尝试在文件中查找字符串模式时,grep 返回“二进制文件(标准输入)匹配”

尝试在文件中查找字符串模式时,grep 返回“二进制文件(标准输入)匹配”

我在 Ubuntu 上输入cat .bash_history | grep git并返回

二进制文件(标准输入)匹配

Mybash_history确实存在,并且其中有很多行以git.

是什么导致它显示此错误以及如何修复它?

答案1

您可以使用grep -a 'pattern'

人 grep页:

-a,--文本
像处理文本一样处理二进制文件;这相当于--二进制文件=文本选项。

答案2

据推测,该文件.bash_history以非文本数据开头,因此grep将该文件视为二进制文件。输出证实了这一点file .bash_history

.bash_history: data 

您可以从头开始读取几个字节以获得一致的视图:

head -c1K .bash_history 

我在这里先读 1 KiB。

您可以将 STDOUT 通过管道传输到hexdump/od或类似的。


作为旁注,grep将文件名作为参数,因此cat在这里没有用;尝试这个:

grep git .bash_history

答案3

这可能是由 bash 历史记录中的空字节引起的。删除包含空字符的行可能会解决该问题。您可以使用 grep 的 Perl-regexp 模式检查它们:

grep -Pa '\x00' .bash_history

这个帖子对非 UNIX 系统有建议。

答案4

错误是由于文件中的数据是二进制的,您可以使用 strings 命令来查看strings您通常使用的搜索的人类可读(即)部分grep

strings data | grep -i whatever

相关内容