全面披露:我们没有对 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