Script para comparar a data do trabalho até a data de hoje e apenas exibir as falhas atuais

3

Divulgação completa: não temos acesso total ao banco de dados autosys, portanto, nossa única opção para manter o histórico é criar um Oracle e usar o comando autorep para gerar dados. Nós temos servidores Linux usando o Bash 3.2.

Eu criei o seguinte script que extrai os detalhes do status do trabalho. Eu quero apenas a saída para arquivar os detalhes de trabalhos que falharam hoje. Eu tentei muitas maneiras diferentes de comparar datas como está e finalmente resolvi converter a data em segundos, em seguida, comparando os segundos de hoje para os segundos de autorep. O script é executado, mas gera todos os trabalhos no status FA e TE, em vez de apenas os trabalhos que falharam hoje. O que estou fazendo errado?

#!/bin/bash

# Get all job start/end/status for current failures/terms

TODAY=$(date '+%D')
TODAYSEC=$(date -d"${TODAY} +%s)

autorep -J SV*_* | egrep -v "gpdata" | grep "GP" | grep grep 'FA\|TE' | while read LINE; do
    JOBNAME=$(echo $LINE | awk '{print $1}')
    LASTSTARTDATE=$(echo $LINE | awk '{print $2}')
    LASTSTARTTIME=$(echo $LINE | awk '{print $3}')
    LASTENDDATE=$(echo $LINE | awk '{print $4}')
    COMPDATE=$(date -d"${LASTENDDATE}" '+%s')
    LASTENDTIME=$(echo $LINE | awk '{print $5}')
    STATUS=$(echo $LINE | awk '{print $6}')
    RUN=$(echo $LINE | awk '{print $7}')
    if (($COMPDATE -eq $TODAYSEC)); then
        echo "$JOBNAME,$LASTSTARTDATE,$LASTSTARTTIME,$LASTENDDATE,$LASTENDTIME,$STATUS,$RUN"
    fi

done >> output_fe_ta.txt
    
por MKowalski 07.10.2015 / 20:38

2 respostas

1

Um pouco mais arrumado. Eu implementei todas as chamadas do grep com comparações de bash:

today=$(date -d 00:00:00 +%s)

autorep -J SV*_* | 
while IFS= read -r line; do
    if  [[ $line != *gpdata* ]] &&
        [[ $line == *GP* ]] && 
        { [[ $line == *FA* ]] || [[ $line == *TE* ]]; }
    then
        read jobname laststartdate laststarttime lastenddate lastendtime status run <<<"$line"
        compdate=$(date -d "$lastenddate" +%s)
        if (( compdate == today )); then
            echo "$jobname,$laststartdate,$laststarttime,$lastenddate,$lastendtime,$status,$run"
        fi
    fi
done >> output_fe_ta.txt

Em uma expressão aritmética, use == não -eq e $ são opcionais.

Evite ALLCAPSVARNAMES - um dia você acidentalmente usará o PATH e se perguntará por que seu script está quebrado.

    
por 07.10.2015 / 21:16
0

Uma alteração na variável TODAY funciona. Graças a Glenn por isso - eu acredito que isso é o que eu estava fazendo de errado, já que a depuração mostrou que meu código original não estava comparando os segundos como eu esperava. Além disso, descobri que comparar YYYYMMDD funciona e suspeito que seja provavelmente mais eficiente.

#!/bin/bash

TODAY=$(date 00:00:00 +%s)
# TODAY=$(date '+%Y%m%d')

autorep -J GP*_* | egrep -v "gpdata" | grep "GP" | grep grep 'FA\|TE' | while read LINE; do
    JOBNAME=$(echo $LINE | awk '{print $1}')
    LASTSTARTDATE=$(echo $LINE | awk '{print $2}')
    LASTSTARTTIME=$(echo $LINE | awk '{print $3}')
    LASTENDDATE=$(echo $LINE | awk '{print $4}')
    COMPDATE=$(date -d"${LASTENDDATE}" '+%s')
    # COMPDATE=$(date -d"${LASTENDDATE}" '+%Y%m%d')
    LASTENDTIME=$(echo $LINE | awk '{print $5}')
    STATUS=$(echo $LINE | awk '{print $6}')
    RUN=$(echo $LINE | awk '{print $7}')
    if (( COMPDATE = $TODAY )); then
        echo "$JOBNAME,$LASTSTARTDATE,$LASTSTARTTIME,$LASTENDDATE,$LASTENDTIME,$STATUS,$RUN"
    fi

done >> output_fe_ta.txt
    
por 08.10.2015 / 15:50