工作上有这样一个需求:
服务端每天产生的埋点日志比较多>200万行,凌晨2点将这个日志的数据入库到数据库,便于BI分析。
最初我的思路是:写一个shell脚本,将入库的逻辑放入shell脚本中,再将这个shell脚本放入到linux服务器crontab任务中。
说起来简单,但在编写的过程中遇到了问题,主要是日志量大,入库的速度很慢,最初的实现是
cat statlog.log | while read line 这种遍历日志,按行读取来入库,速度超慢。
经优化,采用awk的方式来做:
1,代码如下:
BEGIN{ FS="," user="test" passwd="test" host="192.168.0.9" print "==============start==================" sqlInsert="INSERT INTO log.logs_mobile_stat (p1, p2, p3, p4, p5, type, cookie, user_id, time, platform) VALUES" sql=sqlInsert idx=0 conMysql="mysql -h" host " -u" user " -p'" passwd "' log -e " "date +%Y-%m-%d\ %H:%M:%S" | getline time;print time; } { idx=idx+1 #每1000条记录拼接长一条sql if(idx==1000){ sqlValues="('"$2"', '"$3"', '"$4"', '"$5"', '"$6"', '"$7"', '"$8"', '"$9"','"$1"','"$10"');" sql=sql sqlValues str=conMysql "\"" sql "\" " system(str) idx=0 sql=sqlInsert }else{ sqlValues="('"$2"', '"$3"', '"$4"', '"$5"', '"$6"', '"$7"', '"$8"', '"$9"','"$1"','"$10"')," sql=sql sqlValues } } END{ #去掉最后的分号 sql= substr(sql, 0, length(sql)) str=conMysql "\"" sql "\" " #执行最后不足1000条记录的sql if(idx>0 && idx<1000){ system(str) print"=============end============idx====="idx } "date +%Y--%m-%d\ %H:%M:%S" | getline time2;print time2 print"=============end=================" }
2,将上面的代码保存为stat.awk文件,写个调度stat.awk文件的shell,文件名为executeStat.sh
#!/bin/sh date=`date -d -1day +%Y-%m-%d`; log=/home/www/logs/taofen8/api/statlog.log.$date sudo awk -f /tmp/stat.awk $log
3,将executeStat.sh加入到crontab定时任务中, 每天凌晨2点执行
0 2 * * * sudo /tmp/executeStat.sh > /tmp/stat.log
经线上测试,200万左右的日志入库2分钟左右,速度还可以吧。
相关推荐
收集的awk脚本学习 快速入门 包含sed 和正则表达式 不好用 别下 我重新上传
Sed and Awk 单行脚本快速处理字符或者文本
AWK脚本快速参考.doc
AWK单行脚本快速参考
NS2下无线网络仿真后的trace文件各种参数统计的awk脚本文件,包括时延、吞吐量、丢包率等~~~
AWK脚本语言开发,用于文本分析非常高效,推荐学习
AWK单行脚本快速参考.pdf
作为技术支持工程我们最最经常的工作就是经常碰到要处理文本文件,不管是什么数据库最后都可以导成文本,我们就可以对他进行处理了,这样即使你不是对所有数据库操作都很熟悉也可以对他的数据进行处理了。...
AWK脚本的学习文档,感觉在Linux下面这个比较有意思,可以参考一下
文本间隔: # 在每一行后面增加一空行 sed G awk '{printf("%s \n\n",$0)}' # 将原来的所有空行删除并在每一行后面增加一空行。 # 这样在输出的文本中每一行后面将有且只有一空行。
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
《SED_单行脚本快速参考》的_awk_实现.txt ) sed using awk
Linux运维-运维系统服务04-Shell脚本d7-Shell三剑客(下)-03awk脚本模式.mp4
Ass.Awk 脚本在LTOM的ltom431\ltom\tom_base\tom\src目录下,其名称是:ass109.awk。这个是目前的最新版本,ass.awk 脚本可以帮助我们分析和格式化system state dump。 LTOM的MOS说明: LTOM - TheOn-Board Monitor...
一种UNIX实用工具 sed和awk。 详细解释了UNIX正则式的语法。
存活节点数与时间的关系仿真,此仿真是基于ns2的leach仿真的awk文件
awk是unix,linux中处理文本的好工具,本文用一个实例说明awk脚本的编写及使用.
awk-script:awk脚本指南
awk是unix,linux中处理文本的好工具,本文是怎样使用awk编写脚本的简明教程。