Não é inesperado. O retorno do carro move o cursor para o início da linha. grep já imprimiu o nome do arquivo e o número da linha, e o conteúdo da linha correspondente substitui isso (devido ao retorno do carro antes e depois do primeiro foo na linha).
As devoluções de carro também podem ser gravadas como \r :
printf '\rfoo\rfoo\nfoo\n' >file
Isso criará um arquivo com duas linhas. A primeira linha conterá a palavra foo duas vezes, mas o retorno de carro moverá o cursor para o início da linha. Se estiver usando cat para visualizar este arquivo, parecerá que há apenas um foo na primeira linha.