AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 548278
Accepted
TheRojam
TheRojam
Asked: 2019-10-24 01:19:22 +0800 CST2019-10-24 01:19:22 +0800 CST 2019-10-24 01:19:22 +0800 CST

Converter timestamp Unix em hora legível por humanos

  • 772

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?

text-processing
  • 7 7 respostas
  • 8348 Views

7 respostas

  • Voted
  1. Best Answer
    wurtel
    2019-10-24T01:27:09+08:002019-10-24T01:27:09+08:00

    Se a linha começar com o timestamp unix, isso deve fazer isso:

    perl -pe 's/^(\d+)/localtime $1/e' inputfilename
    

    perl -pinvoca um loop sobre a expressão passada com a -equal é 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. /eindica que o padrão de substituição deve ser avaliado como uma expressão.

    • 20
  2. Stephen Kitt
    2019-10-24T02:02:20+08:002019-10-24T02:02:20+08:00

    Se o seu AWK for Gawk , você pode usar strftime:

    gawk '{ print strftime("%c", $1) }'
    

    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:

    gawk '{ print gensub($1, strftime("%c", $1), 1) }' inputfile
    
    • 18
  3. cjs
    2019-10-24T23:44:10+08:002019-10-24T23:44:10+08:00

    Como Dan menciona em sua resposta , o comando Gnu date(1)pode receber um -dparâ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 um time_tnú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.

    ts2hr() {
        while read n rest; do
            if [[ $n =~ ^[0-9][0-9]*$ ]]; then
                echo "$(date -d @"$n" +"%Y-%m-%d %T")" "$rest"
            else
                echo "$n" "$rest"
            fi
        done
    }
    

    Veja como são algumas entradas e saídas:

    ts2hr <<____
    1571806123 first line
    # A comment?
    1571720456 second date's here
    Just a regular sentence.
    1571547789 The last line.
    ____
    2019-10-23 13:48:43 first line
    # A comment?
    2019-10-22 14:00:56 second date's here
    Just a regular sentence.
    2019-10-20 14:03:09 The last line.
    

    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.

    • 9
  4. Dan
    2019-10-24T20:22:01+08:002019-10-24T20:22:01+08:00

    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.

    $ date -d '1/1/1970 GMT 1571889039 seconds'
    Wed Oct 23 20:50:39 PDT 2019
    

    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:

    $ date -d @2147483647
    Mon Jan 18 19:14:07 PST 2038
    

    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.

    • 8
  5. R.. GitHub STOP HELPING ICE
    2019-10-24T11:15:30+08:002019-10-24T11:15:30+08:00

    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 :

    tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 +
        (tm_year-70)*31536000 + ((tm_year-69)/4)*86400 -
        ((tm_year-1)/100)*86400 + ((tm_year+299)/400)*86400
    

    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 -dque não é portátil, então não tenho certeza se existe alguma boa maneira de fazer isso.

    * Ok, isso pode ser um eufemismo.

    • 3
  6. Teemu Kalvas
    2019-10-26T10:02:01+08:002019-10-26T10:02:01+08:00

    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.

    unix_to_iso_utc () {
        local day_unix=$(($1 / 86400))
        local day_offset=$(($1 % 86400))
        local d=$(($day_unix + 719468))
        local y=$((($d - ($d+2+3*$d/146097)/1461 + ($d-$d/146097)/36524 - ($d+1)/146097)/365))
        local y_d=$((365*$y + $y/4 - $y/100 + $y/400))
        local y_offset=$(($d - $y_d))
        local m=$((($y_offset - ($y_offset+20)/50) / 30))
        local m_d=$((30*$m + 3*($m+4)/5 - 2))
        local day=$(($y_offset - $m_d + 1))
        local m_cont=$((12*$y + $m + 2))
        local year=$(($m_cont/12))
        local month=$(($m_cont%12 + 1))
        local hour=$(($day_offset / 3600))
        local hour_offset=$(($day_offset % 3600))
        local minute=$(($hour_offset / 60))
        local second=$(($hour_offset % 60))
        DATE=$(printf "%04d-%02d-%02dT%02d:%02d:%02d" $year $month $day $hour $minute $second)
    }
    

    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.

    • 2
  7. Zombo
    2019-10-24T16:59:56+08:002019-10-24T16:59:56+08:00

    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 strftimenã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:

    $ cat input.txt
    1571806800 blue
    1571720400 green
    1571634000 orange
    1571547600 red
    1571461200 yellow
    
    $ cat app.php
    <?php
    $r1 = fopen('input.txt', 'r');
    while (true) {
       $s1 = fgets($r1);
       if ($s1 === false) {
          break;
       }
       $a1 = explode(' ', $s1);
       $n1 = + $a1[0];
       echo date(DATE_W3C, $n1), "\n";
    }
    
    $ php app.php
    2019-10-23T05:00:00+00:00
    2019-10-22T05:00:00+00:00
    2019-10-21T05:00:00+00:00
    2019-10-20T05:00:00+00:00
    2019-10-19T05:00:00+00:00
    
    • 1

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]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve