您的位置:首页 > 运维架构 > Shell

编写shell脚本(awk)分析sqlldr入库日志

2019-04-15 09:39 411 查看

需求

     对于使用sqlldr入库异常需要手动处理,由于数据量较大,错误日志会记录每一条数据入库失败的原因,所以直接查看日志,对于整体入库异常分析不够全面,所以编写脚本分析日志。

案列:

表prod_offer_merger_relation

数据文件数据总数:9653 入库数:9134  入库失败数:519  账期:20190325

步骤

1查看日志

[code]wc -l INSERT_day_ord_n00_check_ods_ed_prod_offer_merger_relation_20190325_001.log

cat

图2

图2是需要简化的部分,包括了出错字段名,和错误原因,目的,同一字段报错合并,并且统计该字段报错总数。

2匹配目标日志

3格式化输出日志

a.统计报错字段及其总数

[code]awk '{if(NR>=46&&NR<=1083)print $0}' INSERT_day_ord_n00_check_ods_ed_prod_offer_merger_relation_20190325_001.log  | awk -F 'column' '{print $2}'|awk NF |tr -d .  |awk '{a[$1]++}END{for(c in a)print a[c],c}'|awk '{print "字段名:" $2 "   失败次数" $1}'

说明:

[code] '{if(NR>=46&&NR<=1083)print $0}'匹配目标日志,(45.1085 没有匹配到目标日志有做调整)
awk -F 'column' '{print $2}' 提取报错字段
awk NF 删除空行
tr -d . 替换 ‘.’ 号
awk '{a[$1]++}END{for(c in a)print a[c],c}'
每行$1作为数组下标,同一下标该数组成员值加1,以统计该字段出现次数,并且遍历数组所有元素
awk '{print "字段名:" $2 "   失败次数" $1}'
格式化 输出

339+180=519=入库失败数(完成)

b.报错类型

awk '{if(NR>=46&&NR<=1083)print $0}' INSERT_day_ord_n00_check_ods_ed_prod_offer_merger_relation_20190325_001.log | awk '!(NR%2)' |awk '{a[$0]++}END{for(i in a)print i}'

报错类型都是 超过最大长度

固化为shell脚本以便分析入库异常

[code]#此脚本用于分析入库日志
#$1表名 $2账期
table_name_upper=`echo ${1} |tr [a-z} [A-Z]`
log_dir='/home/oracle/ETL/log'
log_file=`ls ${log_dir}/*${1}* |grep $2`
if [ $? != 0 ];then
echo ---------日志文件不存在---------
exit -1
fi
echo ------------日志文件--------------
head_num=`awk '/ROWS parameter ignored when an XML, LOB or VARRAY column is loaded/{print NR}' ${log_file}`
tail_num=`awk '/Table/{print NR}' $log_file |tail -n1`
echo ${log_file}
let head_num=$head_num+1
let tail_num=$tail_num-2
echo ------------差异字段统计------------
awk '{if(NR>='${head_num}'&&NR<='${tail_num}')print $0}' ${log_file}  | awk -F 'column' '{print $2}'|awk NF |tr -d .  |awk '{a[$1]++}END{for(c in a)print a[c],c,NF}'|awk '{print "字段名:" $2 "   失败次数" $1}'
echo ------------差异报错统计------------
awk '{if(NR>='$head_num'&&NR<='$tail_num')print $0}' ${log_file} | awk '!(NR%2)' |awk '{a[$0]++}END{for(i in a)print i,a[i]}'

 

vim 编辑

[code]:1,s/46/$head_num/gc
:1,s/1083/\'$tail_num\'/gc
:1,s/INSERT_day_ord_n00_check_ods_ed_prod_offer_merger_relation_20190325_001.log/${log_file}/gc

替换刚刚写好的shell命令行。

脚本测试

 

 

 

 

 

 

 

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: