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.
MacOS
date
- converte a string de data em segundos desde a épocadate
O comando poderia entender meses no formato de strings por meio dastrptime(3)
função libc. Não tenho macos, então não posso testar minha resposta, mas de acordo com a páginadate
de manual do macos :[...]
Agora você só precisa entender como formatar sua data de entrada na página de manual de
strptime(3)
: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
:E por último, como você deseja subtrair a hora atual do seu resultado, você precisa garantir que seu + output_fmt seria:
Portanto, o comando de resultado que transformaria seu formato de data em época deveria ser:
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
$DATE
por${DATE^}
Apenas para completar, também mostrarei como realizar essa mesma operação com:
GNU
date
- converte string de data em segundos desde a ÉpocaIsso é um pouco mais fácil, já que a versão GNU dá
date
mais liberdadeEm sua página de manual :
Então, no meu teste na minha máquina, você deve apenas remover as barras do seu
date
comando input for para entendê-lo: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:
Para ver a data atual em segundos desde a época:
Então agora, para calcular a diferença em segundos, é trivial:
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,
may
ismai
in german eoct
isokt
).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
+%s
argumento 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.
Isso, usando any
date
e any,awk
faria o que você descreve:O acima foi executado neste arquivo de entrada:
Se os nomes dos meses em sua entrada não estiverem todos em letras minúsculas, por exemplo ,
Jan
ouJAN
, basta alterar$3
paratolower($3)
no script.