俺是一枚悲催的数据统计程序员,从先辈的手里接收了这样的代码:

#! /bin/shalias 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/shalias 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.awkBEGIN{...}
{...}
END{...} #可以复用的代码在lib下

但是这样的写法也非常的啰嗦,从获得数据,再把数据导入到awk脚本里环节很多,我在想能不能直接用awk读入数据呢?先写一个从数据库读入数据的shell脚本,然后用awk调用它(system命令)

#! /bin/shcd `dirname $0`alias statdb="/usr/local/mysql/bin/mysql -h 192.168.1.1 -u stat -paaa -A statdb"getDomain()
{item=$1ver=$2if [ -z $item ]; thenecho item is empty string!exitfisql=""if [ -z $ver ]; thensql="select domain from domain_name_list where item ='"$item"';";elsesql="select domain from domain_name_list where item ='"$item"' and ver='"$ver"';";fi#echo $sqlecho $sql | statdb -s | cat
}getDomain $*

awk脚本就可以这样调用:

function loadDomains(item, ver, result, __ARGVEND__)
{command = "/work/stat/read/domain/getdomain.sh "item" "verwhile(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-12-208:/work/stat/read/booklist> echo "" | igawk -f test.awk
89      bookw.yisou.com?        zwjf    sousuo  wap     2013-08-06 16:26:00
92      bookw3.yisou.com        zwjf    sousuo  wap     2013-08-06 16:26:00
21      a1.pp.cn        zwjf    sousuo  wap     2013-06-14 14:53:10
22      a2.pp.cn        zwjf    sousuo  wap     2013-06-14 14:53:10
101     a5.pp.cn        zwjf    sousuo  wap     2013-08-06 16:26:00
90      bookw1.yisou.com        zwjf    sousuo  wap     2013-08-06 16:26:00
93      bookw4.yisou.com        zwjf    sousuo  wap     2013-08-06 16:26:00
23      a3.pp.cn        zwjf    sousuo  wap     2013-06-14 14:53:10
19      so.pp.cn        zwjf    sousuo  wap     2013-06-14 14:53:10
35      a5.pp.cn        zwjf    sousuo  wap     2013-07-09 17:34:16
91      bookw2.yisou.com        zwjf    sousuo  wap     2013-08-06 16:26:00
20      a0.pp.cn        zwjf    sousuo  wap     2013-06-14 14:53:10
94      bookw5.yisou.com        zwjf    sousuo  wap     2013-08-06 16:26:00
wappp@ppcn-12-208:/work/stat/read/booklist> 

转载于:https://www.cnblogs.com/code-style/p/3243534.html

痛并快乐的造轮子之旅:awk访问数据库之旅相关推荐

  1. 基于WPF重复造轮子,写一款数据库文档管理工具(一)

    项目背景 公司业务历史悠久且复杂,数据库的表更是多而繁杂,每次基于老业务做功能开发都需要去翻以前的表和业务代码.需要理解旧的表的用途以及包含的字段的含义,表少还好说,但是表一多这就很浪费时间,而且留下 ...

  2. 微软 CEO 萨提亚·纳德拉:不要重复造轮子,提升技术强密度

    扫描二维码,查看精彩回顾 据中国互联网络信息中心(CNNIC)发布的第 44 次<中国互联网络发展状况统计报告>显示,截至 2019 年 6 月,我国网民规模达 8.54 亿,较 2018 ...

  3. Starfall|“造轮子”是一种乐趣吗?

    欢迎来到一期一会的"Awesome MegEngineer",今天我们要为大家介绍一位来自兴趣界的技术型00后--一枚赤裸裸的"为爱发电"人--Starfall ...

  4. 专访轮子哥:我在微软「造轮子」,一不小心成了知乎大V

    陈梓瀚Vczh,在网络上,大家可能熟悉他在知乎的外号--轮子哥.而在现实中,他的名字就印在久负盛名的C++经典教程<C++ Primer 第五版>的封面上,因为他是这本书的审校之一. 他常 ...

  5. 不是“重复”造轮子,百度飞桨框架2.0如何俘获人心

    2016 年,百度 PaddlePaddle 打响了国产深度学习框架开源的第一枪. 2019 年 4 月,在 Wave Summit 深度学习开发者峰会上,首次发布了PaddlePaddle 的中文名 ...

  6. 经常造轮子的 AI 工程师水平通常不会太差

    题图 | 邵姺画 引子 | 造轮子还是不造轮子,这是一个问题 理查德·费曼教授去世后,人们在他的黑板上发现了 What I cannot create, I do not understand 这句话 ...

  7. Spring Boot并不重复“造轮子”

    2.1 Spring Boot简介 Spring Boot是由Pivotal团队提供的基于Spring的全新框架,其设计目的是简化Spring应用的搭建和开发过程.该框架遵循"约定大于配置& ...

  8. 不再重复造轮子,AI 给你推荐更好的代码,还没bug

    2020-09-18 14:47 导语:还在抠bug抠到怀疑人生? 作者 | 青 暮 编辑 | 丛 末 程序员的的代码大部分都不是如同写书法那般一挥而就,而需要反复地抠bug,抠到怀疑人生. 剑桥大学 ...

  9. 七月新增开源项目:你学习的速度跟得上前端造轮子的速度吗?

    2019独角兽企业重金招聘Python工程师标准>>> 每月新增开源项目.顾名思义,每月更新一期.我们会从社区上个月新收录的开源项目中,挑选出有价值的.有用的.优秀的.或者好玩的开源 ...

最新文章

  1. 【Codeforces】1111B - Average Superhero Gang Power
  2. Opengl-几何着色器(劫持顶点的家伙)
  3. jQuery 图片剪裁插件初探之 Jcrop
  4. java 操作系统 模拟 daima_求C/C++或java写的比较简单的操作系统的模拟程序
  5. QT获取本地网络信息
  6. 基于RBAC模型的通用权限管理系统的设计(数据模型)的扩展
  7. linux命令:vim文件操作命令、新建用户,查看用户列表,chown命令
  8. vbox虚拟系统和主系统自动挂载共享文件夹
  9. phpcms开启在线编辑模版 方法
  10. mybatis+oracle批量插入报不符合协议和sql未正确结束
  11. java batik_java – Batik传递库依赖项
  12. 呼叫中心系统源码_RC09(支持二次开发)CC呼叫中心系统 源码
  13. 音频功放的失真的原因分析及测量
  14. springboot整合数据库
  15. JavaScript:分支流程控制switch语句详解
  16. 证书扫描件怎么弄?手机也能轻松扫描
  17. 接口测试面试题汇总(含答案)
  18. [刷题]leetcode\167_两数之和Ⅱ
  19. 网络工程师的就业前景如何?市场需求如何?
  20. 共振峰检测matlab,基于 LPC 系数的共振峰估计

热门文章

  1. python re库常用_Python re库指南
  2. IC/FPGA校招笔试题分析(四)再看Moore状态机实现序列检测器
  3. 【 C 】在单链表中插入一个新节点的尝试(二)
  4. perl dancer + net::ssh2监控服务器性能
  5. 关系型数据库 和 非关系型数据对比 以及 MySQL与Oracle对比
  6. wordpress媒体库上传含中文的文件名后,标题被重新编码。
  7. 帧中继和路由协议详解-在帧中继多点子接口上运行EIGRP
  8. 10分钟让你完全理解观察者模式
  9. PHP服务器时间差8小时解决方案
  10. Linux程序前台后台切换