Como canalizar a saída para a data -d "valor"?

12

Eu tenho uma data como "2014-01-30 05:04:27 GMT" e se eu executar a data -d "2014-01-30 05:04:27 GMT", a saída será no fuso horário do meu servidor ("Qui 30 de janeiro 16:04:27 EST 2014 ").

Com o uso de grep e cut, extraí a data no GMT de um arquivo. No entanto, estou lutando para converter isso em meu horário local.

Por exemplo:

[usuário @ log do servidor] # grep "something" logfile.txt | grep "Bem-sucedido" | cut -f1 -d '['

Saída: 2014-01-30 05:04:27 GMT

O que posso adicionar no final, para passar essa saída para "date -d"?

Tentada:

  • [usuário @ log do servidor] # grep "something" logfile.txt | grep "Bem-sucedido" | cut -f1 -d '[' | data -d
  • [usuário @ log do servidor] # grep "something" logfile.txt | grep "Bem-sucedido" | cut -f1 -d '[' | encontro
  • [usuário @ log do servidor] # grep "something" logfile.txt | grep "Bem-sucedido" | cut -f1 -d '[' | data-d "$ 1"
Shane
fonte

Respostas:

12
gmt="$(grep "something" logfile.txt | grep "Succeeded" | cut -f1 -d'[')"
date -d "$gmt"

Ou, se você preferir o formato do pipeline:

grep "something" logfile.txt | grep "Succeeded" | cut -f1 -d'[' | { read gmt ; date -d "$gmt" ; }

O problema é que datenão usa stdin. Portanto, temos que capturar o stdin em uma variável (chamada gmtaqui) e depois fornecê-la na linha de comando date.

Exemplo de saída da segunda abordagem:

$ echo  "2014-01-30 05:04:27 GMT" | { read gmt ; date -d "$gmt" ; }
Wed Jan 29 21:04:27 PST 2014
John1024
fonte
1
Obrigado, isso resolveu o problema! Também agradecemos por explicar o motivo por que não estava funcionando.
Shane
18

Se você está usando a data GNU de um coreutils suficientemente recente, existe date -f, na tela de ajuda:

-f, --file=DATEFILE       like --date once for each line of DATEFILE

Portanto, sua tentativa 4 poderia ter sido:

$ grep "something" logfile.txt | grep "Succeeded" | cut -f1 -d'[' | date -f -

o último -significa stdin.

hroptatyr
fonte
2
Essa deve ser a resposta aceita.
Petrus K.
É possível comparar a saída do comando acima com uma data específica. Por exemplo. Preciso listar todas as datas anteriores a "Qua 30 de janeiro, 21:04:27 PST 2014"
Manu
@Manu não per se, o dateutils possui dategreppara esse caso de uso específico.
Hroptatyr
Isso é muito mais fácil! Se eu pudesse ler, poderia ter encontrado isso na página de manual dele.
Ken Sharp