Use o awk para imprimir e editar uma data

2

Estou procurando um comando de uma linha para obter minha saída desejada. Texto normal se parece com: "test_list_20160915_bla.log" Saída desejada: "2016/09/15"

Eu poderia fazer isso com dois comandos awk (eu sei que o comando só imprime o ano, é apenas para o propósito):

echo "test_list_20160915_bla.log" |awk -F_ '$3 ~ /[0-9]/ {print $3}' |awk 'BEGIN {OFS="/"} {print substr($1,1,4)}'

Mas como eu uso isso dentro de um comando? O awk é mesmo a ferramenta certa para isso? Talvez sed possa fazer o mesmo, mas estou mais familiarizado com o awk.

Eu tenho alguns problemas com a solução fornecida. Às vezes temos arquivos como: "test_20161205145213.log". Com o comando sed minha saída será parecida com "2051/45/21", o que é muito ruim. Tentei várias coisas, mas não consigo descobrir.

Comutado isso

 sed -r 's!^.*_([0-9]{4})([0-9]{2})([0-9]{2})_.*$!//!'

para

 sed -r 's!^.*(20[0-9]{2})([0-9]{2})([0-9]{2}).*$!//!'

Isso limita as saídas de erro aos timestamps com a hora 2. Eu preferiria ignorar completamente o nome do arquivo e só ir para o timestamp nele.

O carimbo de data / hora pode ser yyymmdd_hhmmss ou yyymmddhhmmss. Eu só preciso da parte yyyy / mm / dd. O problema é que não há comprimento fixo ou separador de campo.

    
por M.S. 15.09.2016 / 10:28

1 resposta

2

Você pode dividir e usar o mesmo script awk :

echo "test_list_20160915_bla.log" |
    awk -F_ '$3 ~ /^[1-9][0-9]*$/ { print substr($3,1,4) "/" substr($3,5,2) "/" substr($3,7,2) }'

Aqui, apenas extraímos os grupos de dígitos ano, mês e dia do terceiro campo "_" e os imprimimos.

Ou com sed , que também lida com seu requisito adicional:

(
    echo "test_list_20160915_bla.log"
    echo "test_20161205145213.log"
) |
    sed -r 's!^.*_([0-9]{4})([0-9]{2})([0-9]{2}).*$!//!'

Aqui, usamos uma Expressão Regular para capturar grupos de três dígitos para ano, mês e dia, descartando todo o resto e, em seguida, imprimimos os três grupos associados por / .

    
por 15.09.2016 / 10:31