Podemos usar sed ou awk para resolver completamente o problema.
com sed :
$ sed 's/^.\./0&/' file.txt
Quando & ocorre na parte de substituição do comando de substituição ( s ), ele será expandido para a parte da linha de entrada que corresponde à parte do padrão do comando.
A expressão regular ^.\. significa " corresponde a todas as linhas que começam com ( ^ ) um caractere arbitrário ( . ) seguido por um ponto literal ( \. ) ".
Se a linha for 1.02.2017 23:40:00 , o padrão corresponderá e 1. será substituído por 01. no início da linha.
com awk :
Criando o código parcial awk na pergunta ...
Isto, como dito, imprime o segundo caractere de cada linha de entrada:
$ awk '{ print substr($0, 2, 1) }' file.txt
Podemos usar o fato de que substr($0, 2, 1) retorna o segundo caractere e usa isso como condição:
$ awk 'substr($0, 2, 1) == "." { ... }' file.txt
O que entra em { ... } é o código que prefixa $0 , que é o conteúdo da linha atual, com um zero se a condição anterior for verdadeira:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 }' file.txt
Então só precisamos ter certeza de que todas as linhas são impressas:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 } { print }' file.txt
A condição substr($0, 2, 1) == "." pode, é claro, ser alterada para uma expressão regular também (usamos exatamente a mesma expressão que usamos na sed solution):
$ awk '/^.\./ { $0 = "0" $0 } { print }' file.txt
Algumas pessoas que pensam que "menor é sempre melhor" escreveriam isso como
$ awk '/^.\./ { $0 = "0" $0 } 1' file.txt
(e provavelmente também remove a maioria dos espaços: awk '/^.\./{$0="0"$0}1' file.txt )