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 / 766633
Accepted
Nickotine
Nickotine
Asked: 2024-01-11 15:27:27 +0800 CST2024-01-11 15:27:27 +0800 CST 2024-01-11 15:27:27 +0800 CST

como subtrair uma data no formato: 'xyz/[int][int]/[int][int][int][int]' da data atual?

  • 772

Cenário

Tenho contêineres com datas da última implantação no formato:

mês/dia/ano ou 11/02/2024.

Não posso mudar a forma como eles exibem a data da última implantação.

Gostaria de subtrair a data da última implantação da data atual e, em seguida, gravar em um arquivo se a data da última implantação for superior a 2 meses.

Exemplo container1-last-deploy.txt:

last deployed: jan/01/2024

Eu tenho vários desses arquivos.

O desafio é que o mês seja indicado em letras. Eu poderia usar regex para obter a data.

Uma solução que pensei é ter os meses em um dicionário como:

dict=(
  ['jan']=1
  ['feb']=2
)

Mas certamente haverá uma maneira melhor.

É possível converter o mês com letras em números inteiros?

Isto é para bash em macos, de preferência uma solução bash 3.

bash
  • 3 3 respostas
  • 73 Views

3 respostas

  • Voted
  1. Best Answer
    aviro
    2024-01-11T17:51:15+08:002024-01-11T17:51:15+08:00

    MacOS date- converte a string de data em segundos desde a época

    dateO comando poderia entender meses no formato de strings por meio da strptime(3)função libc. Não tenho macos, então não posso testar minha resposta, mas de acordo com a página date de manual do macos :

    date [-jRu] -f input_fmt new_date [+output_fmt]
    

    [...]

       -f      Use input_fmt as the format string to parse the new_date provided rather than using the
               default [[[mm]dd]HH]MM[[cc]yy][.ss] format.  Parsing is done using strptime(3).
    

    Agora você só precisa entender como formatar sua data de entrada na página de manual de strptime(3):

           %b or %B or %h
                  The month name according to the current locale,  in  abbreviated
                  form or the full name.
    
           %d or %e
                  The day of month (1-31).
    
           %Y     The year, including century (for example, 1991).
    

    Então, de acordo com isso, o formato de entrada deve ser: "%b/%e/%Y".

    Em seguida, você precisa usar o seguinte sinalizador para date:

       -j      Do not try to set the date.  This allows you to use the -f flag in addition to the + option
               to convert one date format to another.  Note that any date or time components unspecified
               by the -f format string take their values from the current time.
    

    E por último, como você deseja subtrair a hora atual do seu resultado, você precisa garantir que seu + output_fmt seria:

           %s     The number of seconds since the Epoch, 1970-01-01 00:00:00
                  +0000 (UTC).  Leap seconds are not counted unless leap
                  second support is available.
    

    Portanto, o comando de resultado que transformaria seu formato de data em época deveria ser:

    $ DATE="jan/01/2024"
    $ date -jf "%b/%e/%Y" $DATE +%s
    1704060000
    

    Novamente, como não tenho macos, não posso testar para confirmar. Também não tenho certeza se aceitaria o mês em letras minúsculas, mas se você tiver que colocar o mês em maiúscula, basta substituir $DATEpor${DATE^}

    Apenas para completar, também mostrarei como realizar essa mesma operação com:

    GNU date- converte string de data em segundos desde a Época

    Isso é um pouco mais fácil, já que a versão GNU dá datemais liberdade

    Em sua página de manual :

           The --date=STRING is a mostly free format human readable date
           string such as "Sun, 29 Feb 2004 16:21:42 -0800" or "2004-02-29
           16:21:42" or even "next Thursday".  A date string may contain
           items indicating calendar date, time of day, time zone, day of
           week, relative time, relative date, and numbers.  An empty string
           indicates the beginning of the day.  The date string format is
           more complex than is easily documented here but is fully
           described in the info documentation.
    

    Então, no meu teste na minha máquina, você deve apenas remover as barras do seu datecomando input for para entendê-lo:

    $ DATE="jan/01/2024"
    $ echo ${DATE//\// }
    jan 01 2024
    $ date --date "${DATE//\// }"  +%s
    1704060000
    

    Subtraia da sua data atual

    Agora você tem a hora da época da sua data original. Basta armazená-lo em uma variável. Por exemplo, no MacOS:

    $ ORIG_DATE=$(date -jf "%b/%e/%Y" $DATE +%s)
    

    Para ver a data atual em segundos desde a época:

    $ date +%s
    1704965965
    

    Então agora, para calcular a diferença em segundos, é trivial:

    $ echo $(( $(date +%s ) - $ORIG_DATE ))
    905967
    
    • 2
  2. Hans-Martin Mosner
    2024-01-11T17:47:38+08:002024-01-11T17:47:38+08:00

    Você deve tentar obter os requisitos exatos (talvez os tenha, mas não os declarou aqui).

    • Um deles é o local a ser assumido para as abreviações dos meses. Por exemplo, em uma localidade alemã, alguns nomes de meses podem causar problemas ao analisar datas impressas por um aplicativo somente em inglês (por exemplo, mayis maiin german e octis okt).

      Se o nome do mês usado corresponder à localidade atual, um simples date -d "$(echo jan/01/2024 | tr / ' ')"analisaria a data de implantação.

    • A outra questão é como você deseja calcular as diferenças de data:

      • Se você estiver usando o número de dias (60 dias como aproximação), poderá converter a data de implantação e a data atual em segundos usando um +%sargumento de formato, subtrair esses números e verificar se o resultado é maior que 60*86400.

      • Se você quiser aderir a alguma regra mais complexa (por exemplo, comparar o dia do mês) você ainda pode fazer isso no bash, mas fica mais difícil.

    • 1
  3. Ed Morton
    2024-01-12T01:23:34+08:002024-01-12T01:23:34+08:00

    Isso, usando any datee any, awkfaria o que você descreve:

    $ awk -v now="$(date +%m/%Y)" -v dif=2 -F'[ /]' '
        BEGIN {
            split(now,n)
            now = n[1] + (n[2] * 12)
        }
        {
            mth = ( index("janfebmaraprmayjunjulaugsepoctnovdec",$3) + 2 ) / 3
            cur = mth + ($5 * 12)
        }
        (now - cur) > dif
    ' file
    last deployed: oct/01/2023
    

    O acima foi executado neste arquivo de entrada:

    $ cat file
    last deployed: oct/01/2023
    last deployed: nov/01/2023
    last deployed: dec/01/2023
    last deployed: jan/01/2024
    

    Se os nomes dos meses em sua entrada não estiverem todos em letras minúsculas, por exemplo , Janou JAN, basta alterar $3para tolower($3)no script.

    • 0

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

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