O grep é orientado à linha - se a entrada não terminar com uma nova linha, ele ainda considera o texto após a última nova linha (ou início do arquivo) como uma linha.
Os programas orientados a linhas são inadequados para processar diretamente arquivos binários - eles geralmente têm casos patológicos se um arquivo binário tiver uma "linha" particularmente longa.
Em vez disso, considere algo como uma combinação de tr
e cmp
:
$ echo -n foo | tr -d -c $'\n' | cmp /dev/null -
# no output and exits with status 0
$ echo foo | tr -d -c $'\n' | cmp /dev/null -
cmp: EOF on /dev/null which is empty
# exits with status 1
Esse método também tem a vantagem de precisar ler a entrada apenas até o primeiro caractere de nova linha (mais buffer).