Alterando o formato de data do arquivo [duplicado]

1

Eu tenho um arquivo assim chamado Sample.txt:

[Sat Sep 10 06:31:41 2016]!Node2!Node1!Node3
[Sun Sep 11 23:31:41 2016]!Node2!Node1!Node3

Eu preciso modificá-lo para que pareça. Preciso alterar o formato de data para este formato

  2016-09-10 06:31:41!ER_DEV!Node2!Node1!Node3
  2016-09-11 23:31:41!ER_DEV!Node2!Node1!Node3
    
por Naresh 20.09.2016 / 21:18

3 respostas

2

Usando awk com ajuda de date :

awk -F '[[\]]' '{cmd="date -d \""$2"\" \"+%F %T\""; cmd | getline out; print out $3}'
  • -F '[[\]]' define o delimitador de campo como [ ou ] , portanto, a data estaria no campo 2 e o restante no campo 3

  • A variável cmd contém o comando date para converter o segundo campo no formato desejado, getline executa o comando date externo e a saída é salva na variável out

  • Finalmente, o conteúdo da variável out e o terceiro campo são impressos

Exemplo:

% cat file.txt
[Sat Sep 10 06:31:41 2016]!Node2!Node1!Node3
[Sun Sep 11 23:31:41 2016]!Node2!Node1!Node3

% awk -F '[[\]]' '{cmd="date -d \""$2"\" \"+%F %T\""; cmd | getline out; print out $3}' file.txt
2016-09-10 06:31:41!Node2!Node1!Node3
2016-09-11 23:31:41!Node2!Node1!Node3
    
por 20.09.2016 / 21:41
1

Usando strptime / strftime do módulo perl Time::Piece :

perl -MTime::Piece -pe '
  s/\[(.*?)\]/Time::Piece->strptime($1, "%a %b %d %H:%M:%S %Y")->strftime("%Y-%m-%d %H:%M:%S!ER_DEV")/e
' Sample.txt
2016-09-10 06:31:41!ER_DEV!Node2!Node1!Node3
2016-09-11 23:31:41!ER_DEV!Node2!Node1!Node3
    
por 20.09.2016 / 21:51
1

Você pode fazer isso com este comando puro sed de força bruta:

sed 's/^.... //
     s/^Jan /01/; s/^Feb /02/; s/^Mar /03/; s/^Apr /04/; s/^May /05/; s/^Jun /06/
     s/^Jul /07/; s/^Aug /08/; s/^Sep /09/; s/^Oct /10/; s/^Nov /11/; s/^Dec /12/
     s/^\(..\) //; s/^\(..\)\(..\)\( ........\) \(....\)./--/'
  • s/^.... // retira o [ e a (abreviação de três letras do) dia da semana.
  • s/^Jan /01/ etc, substitui o (abreviação de três letras do nome do) mês (e o espaço seguinte) com o valor numérico correspondente (número do mês).
  • s/^\(..\) // verifica um valor de data (dia do mês) ou seja, um dígito (ou seja, um número < 10 com um espaço à esquerda) e muda para ter um zero à esquerda. Por exemplo,
      [Sat Sep 309 30903
  • %código% converte a string de data / hora restante de s/^\(..\)\(..\)\( ........\) \(....\)./--/ a mmdd HH:MM:SS YYYY] . (Se você quiser espaços iniciais em sua saída, como mostra a sua pergunta, adicione-os a este comando.)

Notas:

  • Isso não faz nenhum tratamento de erros. Se a entrada não for o que você diz, a saída será embaralhada.
  • Isso codifica os nomes dos meses em inglês, e não se adapta ao local.
por 21.09.2016 / 02:41