用于将作业日期与今天的日期进行比较并仅输出今天的失败的脚本

用于将作业日期与今天的日期进行比较并仅输出今天的失败的脚本

全面披露:我们没有对 autosys 数据库的完全访问权限,因此保留历史记录的唯一选择是创建 Oracle 并使用 autorep 命令输出数据。我们有使用 Bash 3.2 的 Linux 服务器。

我创建了以下脚本来提取作业状态详细信息。我只想输出今天失败的作业的详细信息。我尝试了许多不同的方法来按原样比较日期,最后决定将日期转换为秒,然后将今天的秒与自动代表秒进行比较。该脚本运行,但输出 FA 和 TE 状态的所有作业,而不仅仅是今天失败的作业。我究竟做错了什么?

#!/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

答案1

整齐一点。我通过 bash 比较实现了所有 grep 调用:

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

在算术表达式中,使用==not -eq,并且$是可选的。

避免使用 ALLCAPSVARNAMES ——有一天你会不小心使用 PATH,然后想知道为什么你的脚本被破坏了。

答案2

对 TODAY 变量的更改有效。感谢格伦 - 我相信这是我做错的事情,因为调试表明我的原始代码没有按照我的预期比较秒数。另外,我发现比较 YYYYMMDD 有效,并且我怀疑可能更有效。

#!/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

相关内容