免费注册 查看新帖 |

Chinaunix

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

SHELL变量的二次置换(经验共享) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-23 15:20 |只看该作者 |倒序浏览
根据LOG文件得到更新数据表的名字.
#数组赋值
TABLIST=`grep -i update log/doSql.sh.log|cut -d' ' -f2|sed -e 's/\./,/'|awk -F, '{print $2}'`

根据LOG文件得到更新数据表的记录数
#数组赋值
UP_CNT=`grep 更新件数 log/doSql.sh.log|cut -d'[' -f2|cut -d']' -f1`

根据LOG文件取得按更新条件查询数据表的记录数.
#数组赋值
SEL_CNT=`grep 查询件数 log/doSql.sh.log|cut -d' ' -f3`

以上前提全部解决,表名,更新件数,查询件数三个变量都是数组.并且个数不定.

我想最终用更新减数和查询件数做比较,以确定操作是否正确.

实现如下:

更新件数分别取出.
i=1
for TMPCNT in ${UP_CNT}
        do
                  #关键处
                  eval  UP_CNT${i}=${TMPCNT}
                  #增量计算
                  i=`expr ${i} + 1`  
        done

查询件数分别取出
i=1       
for TMPCNT in ${SEL_CNT}
        do
                   #关键处
                  eval SEL_CNT${i}=${TMPCNT}
                  #增量计算
                  i=`expr ${i} + 1`  
        done

按表进行比较.
i=1
for TABNAME in ${TABLIST}
        do
                   #关键处
                  eval  CNT_A= \$UP_CNT${i}
                  eval  CNT_B= \$SEL_CNT${i}
                  
                  if (( ${CNT_A:=0} == ${CNT_B:=0} ))
                          then
                                  print "${TABNAME} ==> OK"
                          else
                            print "${TABNAME} ==> NG"
                          fi
                  #增量计算
                  i=`expr ${i} + 1`  
        done

另外我想说一下,这个二次变量的替换好象详细解说的地方并不多,或者我没找到.
多数都是简单的,同样的例子,
A=Size
Name=File
FileSize=100
eval echo \$$Name$  
稍微再复杂一点的好象没有.

如果有人知道更详尽用法和解释,请不吝指教,让更多的人不再困惑.
我感谢那些热心帮助的人,也替受益的其他人谢谢大家.

论坛徽章:
0
2 [报告]
发表于 2008-01-23 15:30 |只看该作者
bash3 支持 这样的操作
a=b
b=haha
echo ${!a}

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
3 [报告]
发表于 2008-01-23 15:30 |只看该作者
doSql.sh.log的内容是什么?
根据内容说说你的需求吧。

论坛徽章:
0
4 [报告]
发表于 2008-01-23 15:46 |只看该作者
原帖由 ly5066113 于 2008-1-23 15:30 发表
doSql.sh.log的内容是什么?
根据内容说说你的需求吧。


doSql.sh.log是执行了更新,查询等SQL语句后的LOG文件.
包括SQL执行返回状态代码,执行的SQL语句字符串,和一些自己输出的LOG等综合信息.

需求就是从这一堆执行的LOG信息中取出更新的表名,更新件数,查询件数来判断我更新操作是否正确执行.
做了一个简单的验证.

同一个表
更新件数 = 按更新条件查询得到的件数.

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
5 [报告]
发表于 2008-01-23 15:50 |只看该作者
原帖由 yourkeychen 于 2008-1-23 15:46 发表


doSql.sh.log是执行了更新,查询等SQL语句后的LOG文件.
包括SQL执行返回状态代码,执行的SQL语句字符串,和一些自己输出的LOG等综合信息.

需求就是从这一堆执行的LOG信息中取出更新的表名,更新件数,查询件 ...


doSql.sh.log能贴出部分内容么?
我感觉根据你的描述,应该不用写那么复杂的脚本。

论坛徽章:
0
6 [报告]
发表于 2008-01-23 16:04 |只看该作者
[08/01/23 17:06:07]
UPDATE c23.CD_HONBU_SYONIN_LEVEL RSN SET ( RSN.ZYOSIN_KIZYUNZAN_YEN ) = ( SELECT KOB.ZYOSIN_KIZYUNZAN_YEN FROM ck.CD_HONBU_SYONIN_LEVEL KOB WHERE KOB.SAIMUSYA_CD = RSN.SAIMUSYA_CD AND KOB.HONBU_SYONIN_LEVEL_NO = RSN.HONBU_SYONIN_LEVEL_NO ) WHERE EXISTS ( SELECT 1 FROM ck.CD_HONBU_SYONIN_LEVEL KOB WHERE KOB.SAIMUSYA_CD = RSN.SAIMUSYA_CD AND KOB.HONBU_SYONIN_LEVEL_NO = RSN.HONBU_SYONIN_LEVEL_NO )

SQLCA 情報 sqlcaid : SQLCA sqlcabc: 136 sqlcode: 0 sqlerrml: 0 sqlerrmc: sqlerrp : SQL08020 sqlerrd : (1) 0 (2) 0 (3) 7 (4) 0 (5) 0 (6) 0 sqlwarn : (1) (2) (3) (4) (5) (6) (7) ( (9) (10) (11) sqlstate: 00000
更新件数[7]。


[08/01/23 17:06:11]
UPDATE c23.CD_KIZITU RSN SET ( TYUSYUTU_MM_CNT , YUKO_MM_CNT , KIZITU_KIZYUNZAN_YEN ) = ( SELECT TYUSYUTU_MM_CNT , YUKO_MM_CNT , KIZITU_KIZYUNZAN_YEN  FROM ck.CD_KIZITU KOB WHERE RSN.KIZITU_CD = KOB.KIZITU_CD AND RSN.KIZITU_SUB_CD = KOB.KIZITU_SUB_CD )  WHERE EXISTS ( SELECT 1 FROM ck.CD_KIZITU KOB WHERE RSN.KIZITU_CD = KOB.KIZITU_CD AND RSN.KIZITU_SUB_CD = KOB.KIZITU_SUB_CD )
SQLCA 情報 sqlcaid : SQLCA sqlcabc: 136 sqlcode: 0 sqlerrml: 0 sqlerrmc: sqlerrp : SQL08020 sqlerrd : (1) 0 (2) 0 (3) 2 (4) 0 (5) 0 (6) 0 sqlwarn : (1) (2) (3) (4) (5) (6) (7) ( (9) (10) (11) sqlstate: 00000
更新件数[2]。


[08/01/23 17:06:16]
UPDATE c23.CD_SAIMUSYA RSN SET (KANSA_KIZYUNZAN_YEN,KANSA_KIZYUN_SAIKEN_ZAN_YEN,SYONIN_KIZYUNZAN_YEN) = ( SELECT KANSA_KIZYUNZAN_YEN,KANSA_KIZYUN_SAIKEN_ZAN_YEN,SYONIN_KIZYUNZAN_YEN FROM ck.CD_SAIMUSYA KOB WHERE KOB.SAIMUSYA_CD = RSN.SAIMUSYA_CD ) WHERE EXISTS ( SELECT 1 FROM ck.CD_SAIMUSYA KOB WHERE KOB.SAIMUSYA_CD = RSN.SAIMUSYA_CD )
SQLCA 情報 sqlcaid : SQLCA sqlcabc: 136 sqlcode: 0 sqlerrml: 0 sqlerrmc: sqlerrp : SQL08020 sqlerrd : (1) 0 (2) 0 (3) 8 (4) 0 (5) 0 (6) 0 sqlwarn : (1) (2) (3) (4) (5) (6) (7) ( (9) (10) (11) sqlstate: 00000
更新件数[8]。


[08/01/23 17:06:19]
UPDATE c23.CD_TRIGGER RSN SET TRIGGER_KIZYUNZAN_YEN = ( SELECT TRIGGER_KIZYUNZAN_YEN FROM ck.CD_TRIGGER KOB WHERE KOB.TRIGGER_CD = RSN.TRIGGER_CD ) WHERE EXISTS ( SELECT 1 FROM ck.CD_TRIGGER KOB WHERE KOB.TRIGGER_CD = RSN.TRIGGER_CD )
SQLCA 情報 sqlcaid : SQLCA sqlcabc: 136 sqlcode: 0 sqlerrml: 0 sqlerrmc: sqlerrp : SQL08020 sqlerrd : (1) 0 (2) 0 (3) 21 (4) 0 (5) 0 (6) 0 sqlwarn : (1) (2) (3) (4) (5) (6) (7) ( (9) (10) (11) sqlstate: 00000
更新件数[21]。


[08/01/23 17:06:21]
UPDATE c23.CD_TYUSYUTU_SYOSAI RSN SET ( RSN.HANTEI_KIZYUN_VAL, RSN.KIZYUN_YOSINZAN_YEN, RSN.KIZYUN_YOSINZAN2_YEN, RSN.KIZYUN_YOSINZAN3_YEN, RSN.KIZYUN_YOSINSOGAKU_YEN ) = ( SELECT KOB.HANTEI_KIZYUN_VAL, KOB.KIZYUN_YOSINZAN_YEN, KOB.KIZYUN_YOSINZAN2_YEN, KOB.KIZYUN_YOSINZAN3_YEN, KOB.KIZYUN_YOSINSOGAKU_YEN  FROM ck.CD_TYUSYUTU_SYOSAI KOB  WHERE KOB.TYUSYUTU_CD = RSN.TYUSYUTU_CD  AND KOB.TYUSYUTU_SUB_CD = RSN.TYUSYUTU_SUB_CD ) WHERE EXISTS ( SELECT 1 FROM ck.CD_TYUSYUTU_SYOSAI KOB WHERE KOB.TYUSYUTU_CD = RSN.TYUSYUTU_CD AND KOB.TYUSYUTU_SUB_CD = RSN.TYUSYUTU_SUB_CD )
SQLCA 情報 sqlcaid : SQLCA sqlcabc: 136 sqlcode: 0 sqlerrml: 0 sqlerrmc: sqlerrp : SQL08020 sqlerrd : (1) 0 (2) 0 (3) 63 (4) 0 (5) 0 (6) 0 sqlwarn : (1) (2) (3) (4) (5) (6) (7) ( (9) (10) (11) sqlstate: 00000
更新件数[63]。


[08/01/23 17:06:25]
SELECT COUNT(1) CNT FROM c23.CD_HONBU_SYONIN_LEVEL RSN,ck.CD_HONBU_SYONIN_LEVEL KOB WHERE RSN.SAIMUSYA_CD = KOB.SAIMUSYA_CD AND RSN.HONBU_SYONIN_LEVEL_NO = KOB.HONBU_SYONIN_LEVEL_NO AND RSN.ZYOSIN_KIZYUNZAN_YEN = KOB.ZYOSIN_KIZYUNZAN_YEN
CNT ----------- 7 1 。 SQLCA 情報 sqlcaid : SQLCA sqlcabc: 136 sqlcode: 0 sqlerrml: 0 sqlerrmc: sqlerrp : SQLRI01F sqlerrd : (1) -2147221503 (2) 1 (3) 0 (4) 0 (5) 0 (6) 0 sqlwarn : (1) (2) (3) (4) (5) (6) (7) ( (9) (10) (11) sqlstate: 00000


[08/01/23 17:06:48]
SELECT COUNT(1) CNT FROM c23.CD_KIZITU RSN,ck.CD_KIZITU KOB WHERE RSN.KIZITU_CD = KOB.KIZITU_CD AND RSN.KIZITU_SUB_CD = KOB.KIZITU_SUB_CD AND RSN.TYUSYUTU_MM_CNT = KOB.TYUSYUTU_MM_CNT AND RSN.YUKO_MM_CNT = KOB.YUKO_MM_CNT AND RSN.KIZITU_KIZYUNZAN_YEN = KOB.KIZITU_KIZYUNZAN_YEN
CNT ----------- 2 1 。 SQLCA 情報 sqlcaid : SQLCA sqlcabc: 136 sqlcode: 0 sqlerrml: 0 sqlerrmc: sqlerrp : SQLRI01F sqlerrd : (1) -2147221503 (2) 1 (3) 0 (4) 0 (5) 0 (6) 0 sqlwarn : (1) (2) (3) (4) (5) (6) (7) ( (9) (10) (11) sqlstate: 00000


[08/01/23 17:06:53]
SELECT COUNT(1) CNT FROM c23.CD_SAIMUSYA RSN,ck.CD_SAIMUSYA KOB WHERE RSN.SAIMUSYA_CD = KOB.SAIMUSYA_CD AND RSN.KANSA_KIZYUNZAN_YEN = KOB.KANSA_KIZYUNZAN_YEN AND RSN.KANSA_KIZYUN_SAIKEN_ZAN_YEN = KOB.KANSA_KIZYUN_SAIKEN_ZAN_YEN AND RSN.SYONIN_KIZYUNZAN_YEN = KOB.SYONIN_KIZYUNZAN_YEN
CNT ----------- 8 1 。 SQLCA 情報 sqlcaid : SQLCA sqlcabc: 136 sqlcode: 0 sqlerrml: 0 sqlerrmc: sqlerrp : SQLRI01F sqlerrd : (1) -2147221503 (2) 1 (3) 0 (4) 0 (5) 0 (6) 0 sqlwarn : (1) (2) (3) (4) (5) (6) (7) ( (9) (10) (11) sqlstate: 00000


[08/01/23 17:06:57]
SELECT COUNT(1) CNT FROM c23.CD_TRIGGER RSN,ck.CD_TRIGGER KOB WHERE RSN.TRIGGER_CD = KOB.TRIGGER_CD AND RSN.TRIGGER_KIZYUNZAN_YEN = KOB.TRIGGER_KIZYUNZAN_YEN
CNT ----------- 21 1 。 SQLCA 情報 sqlcaid : SQLCA sqlcabc: 136 sqlcode: 0 sqlerrml: 0 sqlerrmc: sqlerrp : SQLRI01F sqlerrd : (1) -2147221503 (2) 1 (3) 0 (4) 0 (5) 0 (6) 0 sqlwarn : (1) (2) (3) (4) (5) (6) (7) ( (9) (10) (11) sqlstate: 00000


[08/01/23 17:07:00]
SELECT COUNT(1) CNT FROM c23.CD_TYUSYUTU_SYOSAI RSN,ck.CD_TYUSYUTU_SYOSAI KOB WHERE RSN.TYUSYUTU_CD = KOB.TYUSYUTU_CD AND RSN.TYUSYUTU_SUB_CD = KOB.TYUSYUTU_SUB_CD AND RSN.HANTEI_KIZYUN_VAL = KOB.HANTEI_KIZYUN_VAL AND RSN.KIZYUN_YOSINZAN_YEN = KOB.KIZYUN_YOSINZAN_YEN AND RSN.KIZYUN_YOSINZAN2_YEN = KOB.KIZYUN_YOSINZAN2_YEN AND RSN.KIZYUN_YOSINZAN3_YEN = KOB.KIZYUN_YOSINZAN3_YEN AND RSN.KIZYUN_YOSINSOGAKU_YEN = KOB.KIZYUN_YOSINSOGAKU_YEN
CNT ----------- 63 1 。 SQLCA 情報 sqlcaid : SQLCA sqlcabc: 136 sqlcode: 0 sqlerrml: 0 sqlerrmc: sqlerrp : SQLRI01F sqlerrd : (1) -2147221503 (2) 1 (3) 0 (4) 0 (5) 0 (6) 0 sqlwarn : (1) (2) (3) (4) (5) (6) (7) ( (9) (10) (11) sqlstate: 00000



应ly5066113 的要求贴的LOG内容.
先做的更新,后按更新条件做的查询.

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
7 [报告]
发表于 2008-01-23 16:28 |只看该作者
试试这个:
  1. awk '/^UPDATE/{b=$2}/^更新件数/{gsub(/[^0-9]/,"");a[b]=$0}/^SELECT/{b=$5}/^CNT/{a[b]=a[b]" "$3}END{for(i in a) print i,a[i]}' urfile
复制代码


会依次打印出 表名 更新件数 查询件数

论坛徽章:
0
8 [报告]
发表于 2008-01-23 16:54 |只看该作者
这段代码精干.
不过,只出了一个件数,具体是哪个没出,我也不知道.
另外,gsub是awk的函数?

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
9 [报告]
发表于 2008-01-23 17:01 |只看该作者
原帖由 yourkeychen 于 2008-1-23 16:54 发表
这段代码精干.
不过,只出了一个件数,具体是哪个没出,我也不知道.
另外,gsub是awk的函数?


可能是你贴在上面的文本和你实际的文本有出入,gsub是awk的函数。
这样试试:

  1. awk '/^UPDATE/{b=$2}/^更新件数/{gsub(/[^0-9]/,"");a[b]="更新件数 "$0}/^SELECT/{b=$5}/^CNT/{a[b]=a[b]" 查询件数 "$3}END{for(i in a) print i,a[i]}' urfile
复制代码

论坛徽章:
0
10 [报告]
发表于 2008-01-24 09:39 |只看该作者
正常取得了.
只是,a,b的使用意图不是很清楚.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP