zoukankan      html  css  js  c++  java
  • 痛并快乐的造轮子之旅: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 $0`
    
    alias statdb="/usr/local/mysql/bin/mysql -h 192.168.1.1 -u stat -paaa -A statdb"
    
    getDomain()
    {
            item=$1
            ver=$2
    
            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-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> 
  • 相关阅读:
    NTP网络对时器,GPS北斗对时装置—京准电子科技
    NTP网络授时,分布式系统时钟同步重要性-京准电子科技
    GPS时间同步服务器,北斗对时仪-京准电子科技
    北斗授时器(北斗卫星授时器)技术方案—京准电子科技
    CTF-练习平台-Misc之 MISC图穷匕见
    CTF-练习平台-Misc之 细心的大象
    CTF-练习平台-Misc之 Linux基础1
    CTF-练习平台-Misc之 想蹭网先接开密码
    CTF-练习平台-Misc之 再来一道隐写
    CTF-练习平台-Misc之 这么多数据包
  • 原文地址:https://www.cnblogs.com/code-style/p/3243534.html
Copyright © 2011-2022 走看看