Uma abordagem é a de escapar desses caracteres especiais antes de chamar grep .
com zsh :
string='123*.$[]'
grep -e "${string//(#m)[[^.\\$*]/\$MATCH}\$" file
ou POSIXly:
escaped_string=$(printf '%s\n' "$string" | sed 's/[[^.\$*]/\&/g')
grep -e "$escaped_string\$" file
ou supondo que $string não contenha \E , com GNU grep ou pcregrep :
grep -Pe "\Q$string\E\$" file
ou você pode usar awk como:
STRING="$string" awk 'BEGIN {s = ENVIRON["STRING"]; n = length(s)}
length >= n && substr($0, length - n + 1, n) == s'
ou perl :
STRING="$string" perl -ne 'print if /\Q$ENV{"STRING"}\E$/'
(dessa vez, perl sabe que \E encontrado em $ENV{"STRING"} não marca o fim da string \ Quoted).