Como extrair data e calcular se está dentro de “x” dias a partir de hoje?

2

Atualmente tenho arquivo com estrutura como

Foo Sign: blah
    SubFoo Sign: blah
    BarDate: 2017-11-31
Foo Sign: blah
    BarDate: Never
Foo Sign: blah
    BarDate: 2016-12-20
Foo Sign: blah
    BarDate: 2014-12-20
.... and so on

Estas são as quatro principais categorias de dados que residem no arquivo. Não vá com as coisas foo , bar , blah , essas não são importantes. Principal importante é BarDate e seu valor.

Parte Principal

Caso 1: Se o valor BarDate for Never , não preciso fazer nada.

Caso 2: Se BarDate tiver algum valor diferente de Never , o formato será YYYY-MM-DD .

Requisito: Se o BarDate estiver dentro do período de 10 dias a partir de hoje, enviaremos um e-mail para alguém com seus detalhes.

Portanto, hoje é 15-12-2015 se houver qualquer BarDate , que é de 15 a 25 de dezembro de 2015, um e-mail será enviado com seu Foo Sign , BarDate .

Assim, um e-mail será acionado para 2015-12-16 , 2015-12-24 , 2015-12-25 ...

Mas não para 2014-12-16 , 2016-12-24 , 2015-12-26

Até agora, meu script de shell é

foo=""
bardate=""
outputfile="test.txt"
result=""
newline="\n"

### just a workaround step ###
if [ -f $outputfile ];
then
  'rm $outputfile'
fi

### filtering the date which doesn't have BarDate as Never, and writing it to a file ###
'cat datafile | grep -e "Foo Sign" -e BarDate | grep -v "Never" | uniq >> $outputfile'

IFS=$'\n'


### contains is a custom function which returns 1 if param1 is substring of param2 ###
for line in ${cat outputfile};
  do
    contains "$line" "Foo Sign" && foo="$line"
    ### constructing the result string ###
    ### -----> here I have to extract the date and see if it resides within 10 days span from today <----- ###
    ### then only the result string will be constructed ###
    contains "$line" "BarDate" && bardate="$line" && result=$result$newline$foo$newline$bardate$newline
  done

### mail the result ###
echo -e "$result" | mailx -s "BLAH" [email protected]
    
por Anirban Nag 'tintinmj' 14.12.2015 / 20:51

1 resposta

2

Você pode obter o horário atual da época com

date  "+%s"

Você também pode converter qualquer formato de hora em época:

date -d "${MY_TIME}" "+%s"

E esses tempos épicos você pode subtrair.

Tendo a linha com BarDate: 2017-11-31 em uma variável LINE, você pode extrair a data usando:

MY_TIME=$(echo $LINE | cut -d: -f2)
    
por 14.12.2015 / 23:04