痛并快乐的造轮子之旅:awk访问数据库之旅
俺是一枚悲催的数据统计程序员,从先辈的手里接收了这样的代码:
#! /bin/sh alias statdb="mysql -h 192.168.1.1 -u stat -paaa statdb"
sql="select * from abc"
echo $sql | statdb -s > abc
cat abc | awk '{...}' #此处省略400行
俺对于这样的代码标示极度不认同,追求模块化才是俺的理想,于是我把代码写成了这样
#! /bin/sh alias statdb="mysql -h 192.168.1.1 -u stat -paaa"
sql="select * from abc"
echo $sql | statdb -s > abc
echo "" | igawk -f stat.awk -v DATA_FILE="abc"
我的stat.awk的代码长成这样
@include lib/assert.awk
@include lib/makesql.awk BEGIN{...}
{...}
END{...} #可以复用的代码在lib下
但是这样的写法也非常的啰嗦,从获得数据,再把数据导入到awk脚本里环节很多,我在想能不能直接用awk读入数据呢?先写一个从数据库读入数据的shell脚本,然后用awk调用它(system命令)
#! /bin/sh cd `dirname $` alias statdb="/usr/local/mysql/bin/mysql -h 192.168.1.1 -u stat -paaa -A statdb" getDomain()
{
item=$
ver=$ if [ -z $item ]; then
echo item is empty string!
exit
fi sql=""
if [ -z $ver ]; then
sql="select domain from domain_name_list where item ='"$item"';";
else
sql="select domain from domain_name_list where item ='"$item"' and ver='"$ver"';";
fi #echo $sql
echo $sql | statdb -s | cat
} getDomain $*
awk脚本就可以这样调用:
function loadDomains(item, ver, result, __ARGVEND__)
{
command = "/work/stat/read/domain/getdomain.sh "item" "ver
while(command | getline domain)
{
result[domain]
}
close(command)
} BEGIN{
loadDomains("shuqi","wap",SHUQIWAP)
for(i in SHUQIWAP)
{
print i
} print "-------------" loadDomains("shuqi","touch",SHUQITOUCH)
for(i in SHUQITOUCH)
{
print i
}
}
试验了一下,完全是可以的,这样,我就扔掉了中间文件,再也不用让shell先读,读完导入到awk脚本里,但是,既然都可以从shell脚本里读取数据记录了,为啥不能直接连接MYSQL,查询记录集直接生成数组呢?再接再厉,加油!下面是最终版本
function query(sql, db, result, __ARGVEND__)
{
command = "echo \"" sql "\" | " db " -s | cat" while(command | getline record)
{
result[record]
}
close(command)
} function loadDomains(item, ver, result, __ARGVEND__)
{
db = "/usr/local/mysql/bin/mysql -h 192.168.1.1 -u stat -paaa statdb";
sql = "select * from domain_name_list where item ='%s' and ver = '%s' ;"
sql = sprintf(sql,item,ver) query(sql, db, result)
} BEGIN{ # sql = "select domain from domain_name_list where item ='shuqi' and ver = 'wap' ;"
# db = "/usr/local/mysql/bin/mysql -h 59.151.37.16 -u ppstat -pstatpp -A statdb";
# query(sql,db,result) loadDomains("shuqi","wap",result)
loadDomains("sousuo","wap",result1) for(i in result1)
{
print i
}
}
下面是调用执行结果:
wappp@ppcn--:/work/stat/read/booklist> echo "" | igawk -f test.awk
bookw.yisou.com? zwjf sousuo wap -- ::
bookw3.yisou.com zwjf sousuo wap -- ::
a1.pp.cn zwjf sousuo wap -- ::
a2.pp.cn zwjf sousuo wap -- ::
a5.pp.cn zwjf sousuo wap -- ::
bookw1.yisou.com zwjf sousuo wap -- ::
bookw4.yisou.com zwjf sousuo wap -- ::
a3.pp.cn zwjf sousuo wap -- ::
so.pp.cn zwjf sousuo wap -- ::
a5.pp.cn zwjf sousuo wap -- ::
bookw2.yisou.com zwjf sousuo wap -- ::
a0.pp.cn zwjf sousuo wap -- ::
bookw5.yisou.com zwjf sousuo wap -- ::
wappp@ppcn--:/work/stat/read/booklist>
痛并快乐的造轮子之旅:awk访问数据库之旅的更多相关文章
- 基于WPF重复造轮子,写一款数据库文档管理工具(一)
项目背景 公司业务历史悠久且复杂,数据库的表更是多而繁杂,每次基于老业务做功能开发都需要去翻以前的表和业务代码.需要理解旧的表的用途以及包含的字段的含义,表少还好说,但是表一多这就很浪费时间,而且留下 ...
- 避免重复造轮子的UI自动化测试框架开发
一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...
- 【疯狂造轮子-iOS】JSON转Model系列之二
[疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...
- 【疯狂造轮子-iOS】JSON转Model系列之一
[疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...
- h5engine造轮子
基于学习的造轮子,这是一个最简单,最基础的一个canvas渲染引擎,通过这个引擎架构,可以很快的学习canvas渲染模式! 地址:https://github.com/RichLiu1023/h5en ...
- 我为什么还要造轮子?欠踹?Monk.UI表单美化插件诞生记!
背景 目前市场上有很多表单美化的UI,做的都挺不错,但是他们都有一个共同点,那就是90%以上都是前端工程师开发的,导致我们引入这些UI的时候,很难和程序绑定.所以作为程序员的我,下了一个决定!我要自己 ...
- 「iOS造轮子」之UIButton 用Block响应事件
俗语说 一个不懒的程序员不是好程序员 造轮子,也只是为了以后更好的coding. coding,简易明了的代码更是所有程序员都希望看到的 无论是看自己的代码,还是接手别人的代码 都希望一看都知道这代码 ...
- 说说ABP项目中的AutoMapper,Castle Windsor(痛并快乐着)
这篇博客要说的东西跟ABP,AutoMapper和Castle Windsor都有关系,而且也是我在项目中遇到的问题,最终解决了,现在的感受就是“痛并快乐着”. 首先,这篇博客不是讲什么新的知识点,而 ...
- 重复造轮子感悟 – XLinq性能提升心得
曾经的两座大山 1.EF 刚接触linq那段时间,感觉这家伙好神奇,语法好优美,好厉害.后来经历了EF一些不如意的地方,就想去弥补,既然想弥补,就必须去了解原理.最开始甚至很长一段时间都搞不懂IQue ...
随机推荐
- Android数据存储
SharedPreferences----------->for primitive data Internal Storage-------------->for private dat ...
- 自制单片机之一------AT89S51最小系统制做
C51最小系统电路在网上一搜一大把,大同小异.我略做改动后如图: 加一个11.0592MHZ的晶振是为了以后做串口通信时和PC有相同的波特率.可用短路帽切换.说说板子的布局:网上卖的最小系统都是把板子 ...
- javascript学习笔记——chrome等提示找不到“getElementsByTagName”的一种解决方法
最近学习是写了一个小网页,前台有个下拉框是通过后天的xml配置的,在写好代码后使用发现在IE9以及之前的IE浏览器都可以正常获取,但是IE10,chrome和firefox都会在获取一个标签时报get ...
- 传智播客8月C/C++基础班开班
秋天已经向我们走来,在这个充满收获的季节里,大家齐聚传智C/C++学院这个大家庭,无论你曾经从事什么工作,都拥有着一颗热爱C/C++的心,为了自己心中的梦想,大家要付出百倍的努力,要做到&quo ...
- 一个资深java面试官的“面试心得”
在公司当技术面试官几年间,从应届生到工作十几年的应聘者都遇到过.先表达一下我自己对面试的观点: 1.笔试.面试去评价一个人肯定是不够准确的,了解一个人最准确的方式就是“路遥知马力,日久见人心”.通过一 ...
- NOI2011 兔农
http://www.lydsy.com/JudgeOnline/problem.php?id=2432 感觉是day1中最难的一题,还好出题人很良心,给了75分部分分. 还是跪拜策爷吧~Orz ht ...
- Oracle查询死锁&杀死会话
select object_name,machine,s.sid,s.serial# from v$locked_object l,dba_objects o ,v$session s where ...
- bzoj3039 玉蟾宫
Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地.这片土地被分成N*M个格子,每个格子里写着'R'或者' ...
- 【剑指offer】面试题44:扑克牌的顺子
题目: LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定 ...
- Raid1源代码分析--读流程
这篇博文不足之处较多,重新整理了一下,链接:http://www.cnblogs.com/fangpei/p/3890873.html 我阅读的代码的linux内核版本是2.6.32.61.刚进实验室 ...