免费注册 查看新帖 |

Chinaunix

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

请教关于awk与shell交互的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-22 19:27 |只看该作者 |倒序浏览
本帖最后由 1nject10n 于 2011-11-22 19:28 编辑
  1. declare -a infos

  2. /usr/local/webserver/mysql/bin/mysql -hxx.xx.xx.xx -uroot -pxxx-e"$sql"  | while read line
  3. do
  4. #大概是这个意思,但是语法不对。
  5. awk 'FS="\t" {infos[1]=$1;infos[2]=$2;...}'
  6. done
复制代码
大概意思是这样的,我先执行一条sql,之后while read line每次读取一行。
然后使用awk把这一行数据按照\t切割出来,然后再将切割出来的值返回给shell中的infos这个数组。请问该如何在awk中给shell本身的infos数组赋值?


谢谢!

论坛徽章:
0
2 [报告]
发表于 2011-11-22 19:42 |只看该作者
回复 1# 1nject10n
  1. set -A ArrName `awk -F'\t' { ... }`
复制代码
在awk中把值打印出来就行了,我在AIX做的测试

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
3 [报告]
发表于 2011-11-22 20:20 |只看该作者
Q4:如何在sed/awk中使用shell中的变量?反之呢?
A:1.关于awk使用shell变量的总结http://bbs.chinaunix.net/viewthr ... &extra=page%3D1
2.利用shell作变量替换(具体原理看13问之qouting)

    var=abcd
    sed:sed -n "/$var/p"   // awk: awk '/'"$var"'/'
    num=2
    sed: sed -n "${n}p"   //awk: awk 'NR=='"$var"''
    #sed要用双引号,awk变量顺序单双$var双单

复制代码
反之:sed/awk将变量传给shell可以用eval, 如

    eval $(awk 'BEGIN{print "a=ggg b=3"}')
    然后
    echo $a;echo $b
    测试一下

复制代码
================================================



http://bbs.chinaunix.net/thread-674903-1-1.html

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
4 [报告]
发表于 2011-11-22 21:07 |只看该作者
按你接管道这样的写法,你怎么都是没有机会给外面的shell变量赋值了

论坛徽章:
0
5 [报告]
发表于 2011-11-23 16:05 |只看该作者
多谢楼上各位,赋值是能赋值了,不过又遇到了一个问题:

  1. #! /bin/bash

  2. uninstalldate=${1:-`date +%Y-%m-%d -d'1 day ago'`}

  3. sql="SELECT \`t2\`.\`usf_id\` as \`序列\`, \`t2\`.\`usf_reason\` as \`卸载原因\`, \`t1\`.\`usf_description\` as \`详细描述\`, \`t2\`.\`uninstalltime\` as \`卸载时间\`, \`t2\`.\`usf_softwarever\` as \`软件版本\`,
  4. \`table_num_mcode\`, \`table_id_mcode\` from \`bbt_api\`.\`user_software_extend\` as \`t1\`, (select \`usf_id\`, from_unixtime(\`usf_uninstall_timestamp\`) as \`uninstalltime\`, \`usf_softwarever\`, \`usf_reaso
  5. n\`, \`table_num_mcode\`, \`table_id_mcode\` from \`bbt_api\`.\`user_software_feedback\`  WHERE \`usf_uninstall_timestamp\` between unix_timestamp('${uninstalldate}') and unix_timestamp('${uninstalldate} 23:59:5
  6. 9') and \`usf_reason\` <> '0') as \`t2\` WHERE \`t1\`.\`usf_id\` = \`t2\`.\`usf_id\` and \`t1\`.\`usf_description\` <> '0'"

  7. /usr/local/webserver/mysql/bin/mysql -hxxx.xxx.xxx.xxx -uxxx -pxxxx -e"$sql"  | while read line
  8. do
  9.         eval $(awk 'FS="\t"{print "infos=("$1" "$2" "$3" "$4" "$5" "$6" "$7")"}')
  10.         /usr/local/webserver/mysql/bin/mysql -hxx.xx.xx.xx -N -uxxx -pxxx -e"SELECT \`mcode\` FROM \`360_jishi_users\`.\`mcode_${infos[6]}\` WHERE \`id\` = "${infos[7]}
  11. done >> ./test.log
复制代码
我发现使用eval去执行awk 'FS="\t"{print "infos=("$1" "$2" "$3" "$4" "$5" "$6" "$7")"}'的结果后,只能读取一行数据了,也就是while read line分行读取貌似只读取了一行。test.log里面只有一行数据。而实际上第一个sql是有多行数据的,请教这个是什么原因造成的?版主说我这样接管道不行,请问有没有别的办法解决我这种需求?

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
6 [报告]
发表于 2011-11-23 21:53 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP