免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: kunson
打印 上一主题 下一主题

awk中直接执行数据库语句 [复制链接]

论坛徽章:
12
辰龙
日期:2013-10-23 11:06:312015年迎新春徽章
日期:2015-03-04 09:50:28拜羊年徽章
日期:2015-03-03 16:15:43戌狗
日期:2014-12-22 14:49:17申猴
日期:2014-05-14 17:25:17狮子座
日期:2014-04-26 18:50:20双子座
日期:2014-04-04 12:32:31巨蟹座
日期:2014-03-13 00:04:36技术图书徽章
日期:2014-03-12 17:50:42白羊座
日期:2014-02-28 23:46:54丑牛
日期:2013-11-15 05:36:11CU十四周年纪念徽章
日期:2016-01-18 04:54:01
11 [报告]
发表于 2010-11-12 14:31 |只看该作者
本帖最后由 kunson 于 2010-11-12 14:35 编辑
用perl 吧,
heut2009 发表于 2010-11-12 13:09



哈哈,是的,据说perl就是为了综合解决awk,sed,grep等微型语言的应用领域的问题的。

不过我还不会,哈哈。

首贴的awk的办法特点是,语句紧凑,只要处理好怎么把awk的变量传递到system()调用的sql语句中就好了。可惜我功力不够,真气不够强,总是传不过去,哈哈哈。一旦研究清楚,我就在SHELL上又进了一步了,呵呵。

其实awk的变量传递问题,也是我基本功不够扎实,没有根本理解双引号、单引号、及其转义符号的意义,所以不能灵活应用。问题就在这里,呵呵。把这个解决了,就一定能传进去了。

论坛徽章:
0
12 [报告]
发表于 2010-11-12 15:00 |只看该作者
回复 10# kunson


    没错就是这样的

#!/usr/sh

while read V1 V2 V3 V4 V5 V6
do
dbaccess etcfg <<EOF
update  tab2_device
    set name= "$V6"
    where
        ip="$V2"
        protocol= "$V3"
        port      = "$V4"
        account = "$V5";
EOF

done <host

论坛徽章:
12
辰龙
日期:2013-10-23 11:06:312015年迎新春徽章
日期:2015-03-04 09:50:28拜羊年徽章
日期:2015-03-03 16:15:43戌狗
日期:2014-12-22 14:49:17申猴
日期:2014-05-14 17:25:17狮子座
日期:2014-04-26 18:50:20双子座
日期:2014-04-04 12:32:31巨蟹座
日期:2014-03-13 00:04:36技术图书徽章
日期:2014-03-12 17:50:42白羊座
日期:2014-02-28 23:46:54丑牛
日期:2013-11-15 05:36:11CU十四周年纪念徽章
日期:2016-01-18 04:54:01
13 [报告]
发表于 2010-11-12 18:20 |只看该作者
回复  kunson


    没错就是这样的

#!/usr/sh

while read V1 V2 V3 V4 V5 V6
do
dbaccess et ...
oldoger 发表于 2010-11-12 15:00



还有一个细节,V1,V2..等数据,在DB中都是字符串类型的,因此SQL的where字句中需要"$V1"两边还要有单引号,这个怎么装配呢?

论坛徽章:
0
14 [报告]
发表于 2010-11-12 18:22 |只看该作者
回复 13# kunson


    本身脚本里那个字段就有加引号啊
这个引号没有用echo,不会没掉的

论坛徽章:
12
辰龙
日期:2013-10-23 11:06:312015年迎新春徽章
日期:2015-03-04 09:50:28拜羊年徽章
日期:2015-03-03 16:15:43戌狗
日期:2014-12-22 14:49:17申猴
日期:2014-05-14 17:25:17狮子座
日期:2014-04-26 18:50:20双子座
日期:2014-04-04 12:32:31巨蟹座
日期:2014-03-13 00:04:36技术图书徽章
日期:2014-03-12 17:50:42白羊座
日期:2014-02-28 23:46:54丑牛
日期:2013-11-15 05:36:11CU十四周年纪念徽章
日期:2016-01-18 04:54:01
15 [报告]
发表于 2010-11-12 19:25 |只看该作者
回复  kunson


    本身脚本里那个字段就有加引号啊
这个引号没有用echo,不会没掉的
oldoger 发表于 2010-11-12 18:22



比如变脸V2,存储的是字符串类型的ip地址192.168.0.1

那么在SQL语句执行时,where子句应该是
where
    ip='11.192.168.0.1'
...

如果直接用ip="$V2"

会被解析成ip=192.168.0.1,这样在数据库中,类型会不匹配吧?

论坛徽章:
12
辰龙
日期:2013-10-23 11:06:312015年迎新春徽章
日期:2015-03-04 09:50:28拜羊年徽章
日期:2015-03-03 16:15:43戌狗
日期:2014-12-22 14:49:17申猴
日期:2014-05-14 17:25:17狮子座
日期:2014-04-26 18:50:20双子座
日期:2014-04-04 12:32:31巨蟹座
日期:2014-03-13 00:04:36技术图书徽章
日期:2014-03-12 17:50:42白羊座
日期:2014-02-28 23:46:54丑牛
日期:2013-11-15 05:36:11CU十四周年纪念徽章
日期:2016-01-18 04:54:01
16 [报告]
发表于 2010-11-12 20:16 |只看该作者
本帖最后由 kunson 于 2010-11-12 20:21 编辑

首页的awk方式,差点儿可以执行了,语句这么写:


awk '{ system(" dbaccess etcfg<<! select * from tab2_user where name='\''$6"'\''!\" " ") }' host

数据库连接执行了,但是报错:

Database selected.

     802: Cannot open file for run.

Database closed.

上述报错3行位一组,出现了host的行数那么多次。也就是执行了,但是有什么问题导致数据库执行不了。

我的能力不行,不能在一条awk语句中直接解决这个问题了。

就想了一个办法,呵呵,把sql语句写成另一个SHELL程序,在这个awk语句中调用之。
  1. cat name.sql.sh

  2. #!/bin/bash

  3. dbaccess etcfg<<!
  4.     select * from tab2_host where name="$1"
  5. !
复制代码
然后
awk '{ system(" . name.sql.sh "$6" " )}' host

就出来了,呵呵。算是解决了。

但是,我相信,在awk中,在$6两边通过使用各种引号及其转义符号,一定能够用一条awk语句实现。

论坛徽章:
0
17 [报告]
发表于 2010-11-12 21:27 |只看该作者
回复 15# kunson


    引号不会没掉的啊!

论坛徽章:
12
辰龙
日期:2013-10-23 11:06:312015年迎新春徽章
日期:2015-03-04 09:50:28拜羊年徽章
日期:2015-03-03 16:15:43戌狗
日期:2014-12-22 14:49:17申猴
日期:2014-05-14 17:25:17狮子座
日期:2014-04-26 18:50:20双子座
日期:2014-04-04 12:32:31巨蟹座
日期:2014-03-13 00:04:36技术图书徽章
日期:2014-03-12 17:50:42白羊座
日期:2014-02-28 23:46:54丑牛
日期:2013-11-15 05:36:11CU十四周年纪念徽章
日期:2016-01-18 04:54:01
18 [报告]
发表于 2010-11-12 23:08 |只看该作者
本帖最后由 kunson 于 2010-11-12 23:14 编辑
回复  kunson


    引号不会没掉的啊!
oldoger 发表于 2010-11-12 21:27



好的,谢谢哥们儿的关注,我明天继续验证你的语句。


这个帖子首页的问题解决了。
  1. awk '{system("  echo  \"select * from tab2_device where ip='\''"$1"'\'' \"|dbaccess etcfg ")}' hostip
复制代码
或者
  1. awk '{system("  echo  \"select * from tab2_device where ip=\047"$1"\047 \"|dbaccess etcfg ")}' hostip
复制代码
转义要把我转死了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP