209

I'm on Ubuntu and I typed cat .bash_history | grep git and it returned

Binary file (standard input) matches

My bash_history does exist and there are many lines in it that starts with git.

What caused it to display this error and how can I fix it?

4
  • Whats the output of file .bash_history (file ~/.bash_history)?
    – heemayl
    Commented Jan 8, 2017 at 5:07
  • the output is .bash_history: data Commented Jan 8, 2017 at 5:08
  • for some reason this was just happening with my apache logs. thanks for the q&a Commented Apr 24, 2018 at 1:07
  • very closely related: unix.stackexchange.com/q/19907/5510 Commented Feb 8, 2019 at 21:01

5 Answers 5

369

You can use grep -a 'pattern'.

from man grep page:

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

3
  • This has helped me when using the -z flag to match across several lines.
    – stragu
    Commented Apr 24, 2018 at 7:51
  • 2
    It has worked for me, but still weird because my file isn't a binary file. [grid@serverdg2 trace]$ file listener.log listener.log: data
    – Astora
    Commented Dec 1, 2020 at 3:42
  • 1
    It is enough, if your file has a single non-decodable character, and grep will fail (if not used with -a)
    – ivan
    Commented May 5, 2022 at 11:43
28

Presumably the file .bash_history starts with non-text data, hence grep is treating the file as binary. This is confirmed by the file .bash_history output:

.bash_history: data 

You can read a few bytes from start to have a conforming view:

head -c1K .bash_history 

Here I am reading first 1 KiB.

You can pipe the STDOUT to hexdump/od or similar.


As a side note, grep takes filename(s) as argument, so cat is useless here; try this:

grep git .bash_history
8
  • 1
    I'm still not sure how to solve the grep issue, head -c1k .bash_history read the first 38 lines of my .bash_history file. Everything was readable Commented Jan 8, 2017 at 5:22
  • 6
    @TatakaiWasumi Whats the output of grep -a git .bash_history?
    – heemayl
    Commented Jan 8, 2017 at 5:29
  • 2
    That worked! I got everything I wanted from it. What does -a do? Commented Jan 8, 2017 at 5:31
  • 10
    @TatakaiWasumi -a makes grep to treat the file as binary.
    – heemayl
    Commented Jan 8, 2017 at 5:34
  • 9
    -a make grep process a binary file as if it were text.
    – lashgar
    Commented Apr 6, 2018 at 23:01
11

This can be caused by null bytes in your bash history. Removing lines with null characters may resolve the issue. You can check for them using grep's Perl-regexp mode:

grep -Pa '\x00' .bash_history

This post has suggestions for non-unix systems.

3
  • 1
    This actually helped me find out why I was having the same problem.
    – DUO Labs
    Commented Sep 23, 2021 at 19:16
  • Plus one from me too.
    – L1ttl3J1m
    Commented Mar 31, 2022 at 0:43
  • same as me, too Commented Oct 10, 2023 at 2:15
5

I had the same problem when I want to grep my .bash_history. (Little Note: I renamed my history, so that a new one was created. This new history was not treated as a binary.)

In @heemayls answer it is stated, that grep takes filenames and cat would be useless. This is not entirely true. From greps man page:

If no files are specified, or if the file “-” is given, grep searches standard input.

So you could use cat and pipe it to grep. However this solves not the problem that .bash_history is treated as a binary. The only right thing is to use grep -a (Like in the answer from @AK_) whether you grep the history directly or with cat and a pipe.


cat .bash_history | grep -a git

or

grep -a git .bash_history
0
5

Error is due to the data in the file being binary, you can use strings command to see the human readable (i.e. strings) part which you would normally search using grep

strings data | grep -i whatever

1
  • 1
    This does not address the first part of the question, i.e. "what causes the issue".
    – Kusalananda
    Commented Mar 24, 2020 at 9:47

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .