Podemos usar cualquiera de sedo awkpara resolver completamente el problema.
Con sed:
$ sed 's/^.\./0&/' file.txt
Cuando &ocurre en la parte de reemplazo del comando de sustitución ( s), se expandirá a la parte de la línea de entrada que coincida con la parte del patrón del comando.
La expresión regular ^.\.significa "hacer coincidir todas las líneas que comienzan con ( ^) un carácter arbitrario ( .) seguido de un punto literal ( \.) ".
Si la línea es 1.02.2017 23:40:00, el patrón coincidirá y 1.sería reemplazado por 01.al comienzo de la línea.
Con awk:
Sobre la base del awkcódigo parcial en la pregunta ...
Esto, como se indicó, imprimirá el segundo carácter de cada línea de entrada:
$ awk '{ print substr($0, 2, 1) }' file.txt
Podemos usar el hecho de que substr($0, 2, 1)devuelve el segundo carácter y usarlo como condición:
$ awk 'substr($0, 2, 1) == "." { ... }' file.txt
Lo que entra { ... }es un código que precede $0, que es el contenido de la línea actual, con un cero si la condición anterior es verdadera:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 }' file.txt
Entonces solo necesitamos asegurarnos de que todas las líneas estén impresas:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 } { print }' file.txt
La condición substr($0, 2, 1) == ".", por supuesto, también puede cambiarse a una expresión regular (usamos exactamente la misma expresión que usamos en la sedsolución):
$ awk '/^.\./ { $0 = "0" $0 } { print }' file.txt
Algunas personas que piensan que "más corto siempre es mejor" escribirían eso como
$ awk '/^.\./ { $0 = "0" $0 } 1' file.txt
(y probablemente también eliminar la mayoría de espacios: awk '/^.\./{$0="0"$0}1' file.txt)