ans*_*ker 136 grep binary files
我在 Ubuntu 上输入cat .bash_history | grep git并返回
二进制文件(标准输入)匹配
Mybash_history确实存在,并且其中有许多行以git.
是什么导致显示此错误,我该如何解决?
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)
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)