Gostaria de visualizar um arquivo de texto com awk/grep que contém um carimbo de data/hora Unix na primeira coluna. Como posso convertê-lo para um tempo legível durante a visualização?
relate perguntas
-
Grep para um conjunto de linhas de $START a $END AND que contém uma correspondência em $MIDDLE
-
Reorganize as letras e compare duas palavras
-
Subtraindo a mesma coluna entre duas linhas no awk
-
Embaralhamento de arquivo de várias linhas
-
como posso alterar o caso do caractere (de baixo para cima e vice-versa)? ao mesmo tempo [duplicado]
Se a linha começar com o timestamp unix, isso deve fazer isso:
perl -p
invoca um loop sobre a expressão passada com a-e
qual é executado para cada linha da entrada e imprime o buffer no final do loop.A expressão usa o comando substition
s///
para combinar e capturar uma sequência de dígitos no início de cada linha e substituí-la pela representação de hora local desses dígitos interpretados como um carimbo de data/hora unix./e
indica que o padrão de substituição deve ser avaliado como uma expressão.Se o seu AWK for Gawk , você pode usar
strftime
:irá converter o carimbo de data/hora na primeira coluna para a representação de data/hora padrão da localidade atual.
Você pode usar isso para transformar o conteúdo antes de visualizá-lo:
Como Dan menciona em sua resposta , o comando Gnu
date(1)
pode receber um-d
parâmetro com uma data ou carimbo de data/hora que ele tratará como a data a ser gerada.date(1)
(No entanto, isso não está disponível nos comandos POSIX ou BSD .)@1571806800
é o formato usado para especificar umtime_t
número inteiro.Aqui está uma função de shell Bash que atua como um filtro, lendo linhas da entrada, assumindo que qualquer palavra que comece uma linha que seja composta de todos os dígitos seja um carimbo de data/hora e convertendo isso em saída legível por humanos em um dos meus formatos favoritos.
Veja como são algumas entradas e saídas:
Você pode ajustar a função conforme necessário para lidar com os formatos específicos de entrada e saída necessários, bem como as ferramentas disponíveis. A função acima é Bash principalmente porque o
=~
operador facilitou a correspondência de padrões; se você precisar disso no Bourne shell, terá que codificar a verificação de maneira diferente, se realmente precisar.use "data"
Você não precisa de perl, awk, php ou uma expressão aritmética longa para isso. Você pode fazer isso com gnu "date", que é realmente bastante útil para esse tipo de coisa. Para outras versões de "date", seu YMMV.
O que está acontecendo aqui é que você está especificando um tempo e um ajuste para ele. A hora é meia-noite de 1º de janeiro de 1970 GMT, a época unix. (Meia-noite não é fornecida explicitamente; é usada implicitamente sempre que você omitir a hora do dia.)
O ajuste, 1571889039 segundos, é adicionado ao tempo. Use seu carimbo de data/hora, obviamente. Os documentos usam a palavra "relativa" para esse recurso.
Existe uma versão mais concisa, documentada apenas por um exemplo na página de manual, que funciona para versões mais recentes do gnu date:
Se você precisa manipular datas com frequência, conheça seu comando date. É mais do que apenas um relógio; é uma biblioteca de data/hora para o shell.
Para uma versão portátil disso, na pior das hipóteses, você mesmo pode fazer as contas. Os timestamps Unix são definidos em POSIX XBD 4.16 Seconds Since the Epoch :
Este é o inverso do mapeamento que você deseja, portanto, um pouco de trabalho * é necessário para revertê-lo. Isso levará você ao "POSIX UTC" detalhado, mas talvez você precise formatá-lo no fuso horário atual. Parece
date -d
que não é portátil, então não tenho certeza se existe alguma boa maneira de fazer isso.* Ok, isso pode ser um eufemismo.
Se você não tem data gnu ou acesso a uma linguagem de programação com strftime ou equivalente, você tem que fazer as contas você mesmo, o que entra no território do golfe de código.
Você provavelmente também não tem um banco de dados de fuso horário nesse ponto, o que pode ser um grande problema prático, a menos que você possa codificar o que precisa.
Como foi dito, não há realmente uma maneira portátil de fazer isso usando shell, ou mesmo AWK. O GAWK pode fazer isso, mas o GAWK
strftime
não está disponível com certas versões do AWK, ou seja, MAWK. E MAWK é usado com algumas distribuições populares, por exemplo Debian.Concordo que um shell portátil ou solução AWK deve estar disponível para isso. Mas como não é, e provavelmente não será por muitos anos, ou nunca, a melhor solução é usar apenas uma linguagem de programação. Perl foi sugerido, outra opção é PHP: