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

ans*_*ker 136 grep binary files

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

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

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

是什么导致显示此错误,我该如何解决?

AK_*_*AK_ 262

您可以使用grep -a 'pattern'.

来自man grep页面:

-a, --text 像
处理文本一样处理二进制文件;这等效于--binary-files=text选项。


hee*_*ayl 22

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

.bash_history: data 
Run Code Online (Sandbox Code Playgroud)

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

head -c1K .bash_history 
Run Code Online (Sandbox Code Playgroud)

在这里,我首先阅读 1 KiB。

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


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

grep git .bash_history
Run Code Online (Sandbox Code Playgroud)

  • @Tata​​kaiWasumi `-a` 使 `grep` 将文件视为二进制文件。 (9认同)
  • `-a` 使 `grep` 像处理文本一样处理二进制文件。 (9认同)
  • @Tata​​kaiWasumi `grep -a git .bash_history` 的输出是什么? (6认同)
  • 那行得通!我从中得到了我想要的一切。`-a` 有什么作用? (2认同)

Bra*_*son 11

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

grep -Pa '\x00' .bash_history
Run Code Online (Sandbox Code Playgroud)

这篇文章对非 UNIX 系统提出了建议。


小智 5

当我想 grep 我的.bash_history. (小注:我重命名了我的历史记录,以便创建一个新历史记录。这个新历史记录不被视为二进制文件。)

在@heemayls 的回答中指出,这grep需要文件名并且cat是无用的。这并不完全正确。从greps 手册页:

如果没有指定文件,或者给出了文件“-”,grep 将搜索标准输入。

所以你可以使用cat它并将其通过管道传输到grep. 然而,这并不能解决.bash_history被视为二进制的问题。唯一正确的做法是使用grep -a(如@AK_ 的回答),无论grep是直接使用历史记录还是使用cat管道。


cat .bash_history | grep -a git
Run Code Online (Sandbox Code Playgroud)

或者

grep -a git .bash_history
Run Code Online (Sandbox Code Playgroud)