• 全世界谁倾听你
  • 网站正式加入腾讯404公益
  • 霸气的藏獒
  • Apache为什么二级域名不能加载证书呢?
  • 将网站做了一个微信小程序了,等待审核!
  • 一张图完美讲述VIM命令
  • 生活中不简简单单是做对的事,更是要把对的事情做对,如果还有一层,那么应该尝试把错的事情也做对! by 尼古拉斯·拉布拉卡
  • 123木头人
  • Windows命令提示符中统计行数
  • 一张图看懂上海17区县名字来源

mysql定时拉报表给领导

LINUX IT敢客 4个月前 (01-30) 36690次浏览 已收录 0个评论 扫描二维码

        基于之前的一片文章  mysql 查询导出 csv 文件并自动发送附件给领导  ,最近发现一个小小的 bug,然后也是优化了一下。
        BUG:基于 mysql 查询出来的结果是 tab 分割字段的,而之前用的脚本处理,是用空格进行处理,以至于后来查询结果中有字段值里面有空格,而导致最后出来的报表中有错乱的现象,还有有些字段内容本身就是空的,也会出现栏目交错的现象!

        
之前的逻辑在这里:用 tr 命令将空行换成逗号,之后进行导入 csv 文件;

/usr/bin/mysql -h xxx.xxx.xxx.xxx -u $dbuser -p$passwd >1.log << EOF
use $dbname;
source data1.sql
EOF
cat 1.log | while read line
do
echo $line | tr " " ","
done > data1.csv

        后来,将 1.log 拿到本地查看,发现每个字段之间是 tab 分割的,这就表示之前将空格分割的逻辑是错误的;按理来说,只要将空格替换成\t 的 tab 就可以了,后来发现还是不行,因为循环读 1.log 内容的时候,每一行将 tab 都换成空行了。所以只能先将所有的 tab 换成逗号,然后再进行转化成 csv 文件。处理后的逻辑如下所示

/usr/bin/mysql -h xxx.xxx.xxx.xxx -u $dbuser -p$passwd >1.log << EOF
use $dbname; 
source data1.sql 
EOF
sed -i 's/\t/,/g' 1.log
cat 1.log | while read line
do
echo $line 
done > data1.csv

        所以最后整体的脚本内容如下:

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
export PATH
cp data_muban.sql data1.sql
today=`date -d "1 days ago" +%Y-%m-%d`
last_sun=`date -d "7 days ago" +%Y-%m-%d`
sed -ir 's/THIS_SAT/'"$today"'/g' data1.sql
sed -ir 's/LAST_SUN/'"$last_sun"'/g' data1.sql
passwd='yourdbpasswd'
dbname='yourdbname'
dbuser='yourdbuser'
/usr/bin/mysql -h xxx.xxx.xxx.xxx -u $dbuser -p$passwd >1.log << EOF
use $dbname;
source data1.sql
EOF
sed -i 's/\t/,/g' 1.log
cat 1.log | while read line
do
echo $line 
done > data1.csv
iconv -c -f utf-8 -t gb2312 data1.csv > data2.csv 
mv data2.csv YHLS_$today.csv
rm -rf data1.*
rm -rf 1.log

sleep 5

cp data1_muban.sql data2.sql
sed -ir 's/THIS_SAT/'"$today"'/g' data2.sql
sed -ir 's/LAST_SUN/'"$last_sun"'/g' data2.sql
/usr/bin/mysql -h xxx.xxx.xxx.xxx -u $dbuser -p$passwd >2.log << EOF
use $dbname;
source data2.sql
EOF
sed -i 's/\t/,/g' 2.log
cat 2.log | while read line
do
echo $line 
done > data2.csv
iconv -c -f utf-8 -t gb2312 data2.csv > data.csv 
mv data.csv FYHY_$today.csv
rm -rf data2.*
rm -rf 2.log

sleep 5

cp data2_muban.sql data3.sql
sed -ir 's/THIS_SAT/'"$today"'/g' data3.sql
sed -ir 's/LAST_SUN/'"$last_sun"'/g' data3.sql
/usr/bin/mysql -h xxx.xxx.xxx.xxx -u $dbuser -p$passwd >3.log << EOF
use $dbname;
source data3.sql
EOF
sed -i 's/\t/,/g' 3.log
cat 3.log | while read line
do
echo $line 
done > data3.csv
iconv -c -f utf-8 -t gb2312 data3.csv > data.csv 
mv data.csv YZZCYH_$today.csv
rm -rf data3.*
rm -rf 3.log

sleep 5

cp data3_muban.sql data4.sql
/usr/bin/mysql -h xxx.xxx.xxx.xxx -u $dbuser -p$passwd >4.log << EOF
use $dbname;
source data4.sql
EOF
sed -i 's/\t/,/g' 4.log
cat 4.log | while read line
do
echo $line 
done > data4.csv
iconv -c -f utf-8 -t gb2312 data4.csv > data.csv
mv data.csv YQQK_$today.csv
rm -rf data4.*
rm -rf 4.log

        另外之余,如果发送的邮件有多位领导,可以多个收件人,sendmail 的方式如下所示,就是第一个收件人后,空格再增加一个收件人。

#!/bin/bash
today=`date -d "1 days ago" +%Y-%m-%d`
/usr/local/bin/sendEmail -f youemail@xxxx.com -t lindao1@xxxx.com lindao2@xxxx.com \
    -s smtp.mxhichina.com -u "每周数据库查询" -o message-content-type=html \
    -o message-charset=utf-8 -a /home/mysql/data1/*_$today.csv -xu youremail@xxxx.com \
    -xp youremailpasswd -m "每周数据库查询-详见附件"

        mysql 定时拉报表给领导好了。欢迎继续交流,测试了!


IT 敢客 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:mysql 定时拉报表给领导
喜欢 (6555)
[313176056@qq.com]
分享 (0)
IT敢客
关于作者:
“我所做的一切都是为了方便我的生活~~~“
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址