작업 날짜와 오늘 날짜를 비교하여 오늘의 실패만 출력하는 스크립트

작업 날짜와 오늘 날짜를 비교하여 오늘의 실패만 출력하는 스크립트

전체 공개: 우리는 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

관련 정보