Com o GNU date :
d=1456478048306
s=${d%???}
ms=${d#"$s"}
date -d "@$s" +"%F %T.$ms %z"
# or:
date -d "$s.$ms" '+%F %T.%3N %z'
com BSD date :
date -r "$s" +"%F %T.$ms %z"
Com GNU awk e versões recentes de mawk (desde 1.3.4 20121129 ):
echo 1456478048306 | awk '{
print strftime("%F %T." substr($0,length-2) " %z", substr($0, 1, length-3))}'
Para portabilidade, perl pode ser sua melhor aposta:
echo 1456478048306 | perl -MPOSIX -lne '
print strftime "%F %T.$2 %z", localtime $1 if /(.+)(.{3})/'
Aqui, dou o meu formato preferido mais convencional e menos ambíguo:
2016-02-26 09:14:08.306 +0000
mas é claro, você pode ajustar o formato strftime de acordo com sua preferência.