^ corresponde ao início de uma string. Por exemplo:
echo "A string with A" | grep ^A
corresponde apenas a strings que começam com A . Observe como o segundo A não é correspondido, pois não está no início da string.
echo "Some string with A" | grep ^A
^A não corresponde a nada porque a string não inicia com A .
Da mesma forma, $ corresponde ao fim de uma string:
echo "A good string" | grep g$
g$ corresponde apenas ao g no final da string.
echo "A string in which g is not the end" | grep g$
não retorna nada porque não termina em g .
Como muru apontou em os comentários ^ e $ não correspondem às primeiras e últimas linhas nas expressões regulares, embora isso possa ser verdade em outras plataformas / programas.