作業日と今日の日付を比較して、今日の失敗のみを出力するスクリプト

作業日と今日の日付を比較して、今日の失敗のみを出力するスクリプト

完全な公開:私たちは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変数に対する変更は有効です。 Glennに感謝します。デバッグでは、元のコードが予想どおりに秒を比較していないことがわかったので、これが私が間違っていると思います。また、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

関連情報