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


70

我在Ubuntu上输入cat .bash_history | grep git,然后返回

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

bash_history的确存在,并且其中有很多行以开头git

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


file .bash_historyfile ~/.bash_history)的输出是什么?
heemayl

输出是.bash_history: data
answerSeeker

由于某种原因,这只是发生在我的Apache日志中。感谢您的
提问

Answers:


11

假定文件.bash_history以非文本数据开头,因此grep将文件视为二进制文件。通过file .bash_history输出确认:

.bash_history: data 

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

head -c1K .bash_history 

在这里,我正在阅读第一个1 KiB。

您可以将STDOUT通过管道传送到hexdump/ od或类似名称。


附带说明一下,grep将文件名作为参数,因此cat这里没有用;做就是了:

grep git .bash_history

我仍然不确定如何解决grep问题,请head -c1k .bash_history阅读我的.bash_history文件的前38行。一切都是可读的
answerSeeker

2
@Tata​​kaiWasumi的输出是grep -a git .bash_history多少?
heemayl

1
可行!我得到了想要的一切。怎么-a办?
answerSeeker

6
@Tata​​kaiWasumi -a使得grep治疗文件作为二进制文件。
heemayl

3
-amake grep处理二进制文件,就好像它是文本一样。
lashgar '18 -4-6

127

您可以使用grep -a 'pattern'

来自man grep页面:

-a, --text
Process a binary file as if it were text; this is equivalent to the ‘--binary-files=text’ option.

当使用-z标志跨几行进行匹配时,这对我有帮助。
stragu

这个答案应该是这个问题的最佳答案。
Michael Pacheco

是的,这个答案更合适!
Daywalker

3

我今天看到了这个问题,因为当我想要grep my时遇到了同样的问题.bash_history。(小注:我重命名了历史记录,以便创建一个新的历史记录。此新历史记录未被视为二进制文件。)

在@heemayls答案中指出,该grep方法使用文件名,cat将毫无用处。这并非完全正确。从greps手册页:

如果未指定文件,或者给出文件“-”,则grep搜索标准输入。

因此您可以使用cat并将其通过管道传输到grep。但是,这不能解决.bash_history被视为二进制文件的问题。唯一正确的方法是直接使用历史记录还是将其与管道一起使用grep -a(就像@AK_的答案一样)。grepcat


cat .bash_history | grep -a git

要么

grep -a git .bash_history


谢谢!对我来说效果很好
Michael Pacheco
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.