Cite o argumento para grep
, assim ls -a | grep '^\.'
A razão para isso é que o shell manipula \.
e o transforma de volta em .
simples, que grep
então trata como um curinga de caractere único. Em caso de dúvida, sempre cite uma string que contenha (ou possa conter) um caractere especial para o shell.