编写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命令行。
脚本测试
相关文章推荐
- linux通过awk命令,查询日志,分析数据,获取平均时间shell脚本
- 使用shell脚本分析网站日志统计PV、404、500等数据
- Shell日志分析之应用日志分析脚本上
- 使用shell脚本分析网站日志统计PV、404、500等数据
- shell linux日志分析脚本
- Shell日志分析之应用日志分析脚本下
- linux下编写清理日志和oracle数据库临时数据的shell脚本
- shell脚本分析 nginx日志访问次数最多及最耗时的页面(慢查询)
- Linux查看磁盘信息(编写shell脚本来分析文件的占用情况)
- 【shell脚本练习】网卡信息和简单日志分析
- shell 脚本分析nginx 访问日志状态码
- 用shell编写批量打包日志脚本
- 【shell脚本练习】网卡信息和简单日志分析
- shell脚本分析 nginx日志访问次数最多及最耗时的页面(慢查询)
- shell 日志分析 获取code的统计——grep awk group功能使用
- mysql5.6.7多实例安装、配置的详细讲解分析及shell启动脚本的编写
- nginx日志分析shell脚本
- 【shell脚本练习】网卡信息和简单日志分析
- 日志分析的shell脚本
- shell脚本分析nginx日志