免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6654 | 回复: 17
打印 上一主题 下一主题

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
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-11 18:22 |只看该作者 |倒序浏览
本帖最后由 kunson 于 2010-11-11 18:34 编辑

Informix数据库,在命令行,可以执行如下查询语句
  1. $ echo "select * from tab2_device where ip='192.168.0.3' "|dbaccess etcfg
复制代码
现在把ip写入文件hostip中

  1. $cat hostip
  2. 192.168.0.3
  3. $
复制代码
希望用awk把ip地址从文件hostip提取出来然后用,awk的system调用数据库,进行查询。有误的代码是:

$ awk '{system("echo "select * from tab2_device   where ip=?$1? "|dbaccess etcfg  ")}' hostip


其中  ?$1?  是我不能完成的部分,应该是单引号、双引号的使用和转义。找到一个帖子,没有看懂,而且我的例子和帖子不完全一样。所以请教大家。

先解决语句,然后进一步讨论,谢谢!

论坛徽章:
0
2 [报告]
发表于 2010-11-11 19:35 |只看该作者
  1. echo "aa"| awk '{command="ls -tlr "$1; while(command|getline var) print var}'
复制代码
是需要这个样子吗?

论坛徽章:
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
3 [报告]
发表于 2010-11-11 20:42 |只看该作者
是需要这个样子吗?
wmjie 发表于 2010-11-11 19:35


谢谢回复。

1、以前翻帖子,觉得这种装配方式和我的例子中的方式是等价的。

2、只要能实现,这个样子的语句也可以。您有解法吗?

3、可以说明一下您的语句吗?

论坛徽章:
0
4 [报告]
发表于 2010-11-12 07:30 |只看该作者
[oracle@node2 ~]$ while read line ;do echo "select * from tab2_device where ip='$line'|dbaccess etcfg"; done<hostip
select * from tab2_device where ip='192.168.0.3'|dbaccess etcfg

论坛徽章:
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
5 [报告]
发表于 2010-11-12 10:02 |只看该作者
本帖最后由 kunson 于 2010-11-12 10:31 编辑
[oracle@node2 ~]$ while read line ;do echo "select * from tab2_device where ip='$line'|dbaccess etcf ...
oldoger 发表于 2010-11-12 07:30



谢谢回复。

您的方法和我的需求有些不同。

装配出了sql语句,而没有立即执行sql语句,只进行了打印。我期望在awk调用system(),立即执行它。

sql语句的select之前与|之前应该有双引号,就是说,在命令行,待执行的sql语句因该是
echo "select * from ....." | dbaccess etcfg

另外,用awk的原因是想从多个外部文件提取多个字段,组合成更复杂的sql语句,然后用system()调用在awk中立即执行sql。

期待进步一讨论。

论坛徽章:
0
6 [报告]
发表于 2010-11-12 10:57 |只看该作者
#!/bin/sh

while read line
do

dbaccess etcfg <<EOF
select * from tab2_device where ip="$line"
EOF

done <hostip

论坛徽章:
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
7 [报告]
发表于 2010-11-12 11:38 |只看该作者
#!/bin/sh

while read line
do

dbaccess etcfg
oldoger 发表于 2010-11-12 10:57


谢谢,这个可以执行没有问题。

不过,如果where字句需要说明多个字段的值,不同字段的值来自不同的文件,用read的方式可以处理吗?

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


    如果这样的话,建议先把多个文件并到一个文件里进行处理
你可以给个例子先!

论坛徽章:
0
9 [报告]
发表于 2010-11-12 13:09 |只看该作者
用perl 吧,

论坛徽章:
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
10 [报告]
发表于 2010-11-12 14:21 |只看该作者
回复  kunson


    如果这样的话,建议先把多个文件并到一个文件里进行处理
你可以给个例子先!
oldoger 发表于 2010-11-12 12:57


哈哈,好的!

原始需求的简化版是这样的,一个文件host,有6个字段
HOST01        192.168.0.1        ssh        22        weblogic        张三
HOST02        192.168.0.2        ssh        22        weblogic        李四
HOST03        192.168.0.3        ssh        22        weblogic        王麻子

数据库表tab2_device有5个字段:ip,protocol,port,account,name,(依次次和文件host的第2、3、4、5、6字段对应),前四个字段已经有数据。


脚本要完成的是,提取出host文件的每行记录,抓取出其中的第2、3、4、5、6个字段到shell变量VAR1、VAR2、VAR3、VAR4、VAR5中独立存放,然后进行数据库操作,sql语句的逻辑是

update  tab2_device
      set name= SHELL变量VAR5
where
    ip          = SHELL变量VAR1
    protocol= SHELL变量VAR2
      port      = SHELL变量VAR3
      account = SHELL变量VAR4
;

---------


刚才看了一下read的用法,您的方案是不是这样的?
#!/usr/sh

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

done <host
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP