cat .bash_history | grep git
,它返回了二进制文件(标准输入)匹配项
我的
bash_history
确实存在并且有它的许多行都以git
开头。是什么原因导致显示此错误,我该如何解决?
#1 楼
假定文件.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行。一切都可读
–answeranswerker
17年1月8日在5:22
@TatakaiWasumi grep -a git .bash_history的输出是什么?
–heemayl
17年1月8日在5:29
可行!我从中得到了想要的一切。 -a做什么?
–answeranswerker
17年1月8日在5:31
@TatakaiWasumi -a使grep将文件视为二进制文件。
–heemayl
17年1月8日在5:34
-a使grep像对待文本一样处理二进制文件。
– lashgar
18年4月6日在23:01
#2 楼
您可以使用grep -a 'pattern'
。从man grep页面开始:-a,--text
处理二进制文件,就好像它是文本一样;这等效于--binary-files = text选项。
评论
当使用-z标志跨几行进行匹配时,这对我有帮助。
– Stragu
18-4-24在7:51
它对我有用,但仍然很奇怪,因为我的文件不是二进制文件。 [grid @ serverdg2跟踪] $文件listener.log listener.log:数据
– DBA Jr
20年12月1日,下午3:42
#3 楼
当我想grep我的.bash_history
时,我遇到了同样的问题。 (小注:我重命名了历史记录,因此创建了一个新的历史记录。这个新历史记录未被视为二进制文件。)这不是完全正确。从
grep
的手册页:如果未指定文件,或者给出文件“-”,则grep搜索标准输入。
因此您可以使用
cat
并将其通过管道传输到grep
。但是,这不能解决cat
被视为二进制文件的问题。唯一正确的方法是使用grep
(就像@AK_的答案一样),无论是直接使用.bash_history
历史记录还是使用grep -a
和管道都使用历史记录。cat .bash_history | grep -a git
或
grep -a git .bash_history
#4 楼
错误是由于文件中的数据为二进制数据,您可以使用字符串命令查看通常可使用strings
grep
搜索的可读部分(即
strings data | grep -i whatever
)。评论
这没有解决问题的第一部分,即“问题的原因”。
– Kusalananda♦
20 Mar 24 '20 at 9:47
#5 楼
这可能是bash历史记录中的空字节引起的。删除具有空字符的行可以解决此问题。您可以使用grep的Perl-regexp模式进行检查:grep -Pa '\x00' .bash_history
这篇文章对非unix系统提出了建议。
评论
文件.bash_history(文件〜/ .bash_history)的输出是什么?输出为.bash_history:数据
由于某种原因,这只是发生在我的Apache日志中。感谢您的问答
密切相关:unix.stackexchange.com/q/19907/5510