exibindo uma data após determinado número de dias lendo um número

2

Eu tenho um arquivo no qual há uma linha:

Password=md@2507

em que 2507 é a data em que mudei a senha pela última vez. Eu quero um script que leia a data da linha Senha desse arquivo e, em seguida, me mostre a data após 10 dias, pois essa senha expirará após 10 dias dessa data.

    
por Pawan Mishra 25.07.2016 / 09:59

1 resposta

2

Com o GNU sed e o GNU date :

sed -En 's#^Password=.*@([0-9]{2})([0-9]){2}$#date -d "/ +10 days" +%F#ep'

Nós transformamos o 2507 para 25/07 como GNU date espera datas no estilo americano. No entanto, observe que 25/07 é entendido como 25 de julho do ano atual .

O que isso significa é que, se você executar esse comando em 2017-01-02 em uma entrada Password=x@2712 , receberá uma saída 2018-01-06 (10 dias após o 27 de dezembro 2017 ).

O que você poderia fazer é:

eval "$(date +'d=%d m=%m y=%Y')"
awk -v "y=$y" -v "today=-$m-$d" -F @ '
  /^Password=.*@[0-9]{4}$/ {
    d = "-" substr($NF, 3) "-" substr($NF, 1, 2)
    d = (d > today ? y - 1 : y) d
    system("date -d \"" d " +10 days\" +%F");
  }'

Em eval "$(date +'d=%d m=%m y=%Y')" , obtemos a data para a saída da data atual no formato d=25 m=07 y=2016 . Nós tomamos isso e o avaliamos como código de shell para definir as variáveis $d , $m e $y shell. É melhor do que fazer d=$(date +%d) m=$(date +%m) y=$(date +%Y) , pois ele executa somente um comando date e evita o problema quando esse comando é executado em 23: 59: 59.9 no último dia do mês.

Em seguida, executamos awk , com a variável y awk definida para o conteúdo da variável $y shell ( 2017 ) e today definido como -01-02 .

Em awk , se o registro atual corresponder à expressão regular ^Password=.*@[0-9]{4}$ . Isto é, se começar com Password= e terminar em @ , seguido de 4 dígitos decimais, então:

  • Extraia a data dos últimos 4 dígitos e armazene-a na variável d como -mm-dd , como em today .

  • Se d for lexicamente maior que today , por exemplo, no nosso exemplo acima -12-27 é maior que -01-02 , então definimos d para o ano anterior ( 2016-12-27 ), e para o ano atual caso contrário.

  • Em seguida, executamos o comando date -d "2016-12-27 +10 days" +%F . Supondo que o GNU date signifique imprimir em %F format (ou seja, YYYY-MM-DD ) a data especificada por 2016-12-27 +10 days , ou seja, 10 dias após 2016-12-27.

por 25.07.2016 / 10:17