In the following example, grep
behaves strangely: it's supplied with -I
option, which, according to man page, should make grep
ignore binary files (similarly to --binary-files=without-match
), but I still get the "Binary file matches" output.
$ cat <<'EOF' | uudecode > test-file
begin 664 /dev/stdout
M>`&5SLU*Q$`0!&#/>8J^"TM/=^8/1%2\>1`\>.^9Z=D-9!))9@7?WBB^@%"G
MHOBHO+8V=2!'-WU3A9PX%*8PBB:VGK@6)Y*HFAB(.2;.;$SQPX=LNG3(>2SH
MDJE!5;R+E9P21J::8U2+?@R>RK&7:[^L&[Q=]UD6>)$D?9<O_82[Y$\&S4_,
MP[G)-)_RVN[!6(S.>F0/M\B(P]$>5[O^%_$8+/(?,CSI+]%DD;/"^^,K3`OD
,6?8=GK6MPS?WDU!"
`
end
EOF
$ grep -I 8 test-file
Binary file test-file matches
$ grep --binary-files=without-match 8 test-file
Binary file test-file matches
Apparently, grep
considers the file binary, but still does try to match and reports the results with it. Why is the "binary file" not ignored as the -I
option prescribes?
I'm using GNU grep 3.1 on Ubuntu 18.04.
Best Answer
Looking at the grep manual, this seems to be because (bold mine):
However, grep also considers other data as indicating binary files:
So the message won't be printed if:
-I
/--binary-files=without-match
options are givenHowever, that's not the case with the example input. The example file is treated as binary because it doesn't fit the current locale (probably some UTF locale), not because it has null bytes. Otherwise:
If I add a null byte to the file, grep fails successfully: