免费注册 查看新帖 |

Chinaunix

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

如何检索程序中的函数? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-23 23:21 |只看该作者 |倒序浏览
本帖最后由 ljmmail 于 2011-05-23 23:43 编辑

程序中使用了大量的  sprintf() 函数, 现在希望通过脚本查询函数中程序使用情况, 得到如下的处理结果:
file.c: sprintf(buf, "%s, %s, %ld, %s\n", dqdh,  jgdh, SQLCODE, sqlca.sqlerrm);
主要是显示 sprintf() 到分号部分, 以便于对函数中使用的格式化串和变量做检查.

论坛徽章:
0
2 [报告]
发表于 2011-05-23 23:36 |只看该作者
sprintf() 到冒号部分

哪里有冒号?

样本数据呢?

论坛徽章:
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
3 [报告]
发表于 2011-05-24 03:23 |只看该作者
  1. grep "sprintf(.*);" *.c
复制代码

论坛徽章:
0
4 [报告]
发表于 2011-05-24 07:57 |只看该作者
上面的 grep 命令不可以处理多行书写的 sprintf() 调用.
使用
sed  -n  '/sprintf/,/;/'p   *.c
可以得到需要的查询结果, 但是对于哪些单行书写的 sprintf() 就会多出一行数据.

sed  -n  '/sprintf/,/;/'p  pc9254.ec
                                                sprintf(sfda.bz, "扣费户清算金额错");
                                                goto  JFERROR;
                                        sprintf(sfda.bz, "收费组事务提交错");
                                        PCLog(TLEVEL,"[0432] %s %s!\n", sfbz2.qdzl, sfda.bz);
                sprintf(stErrInfo.szErrMsg,"[0737] 扣费入帐%d笔, 错误%d笔",nRzCnt,nBrzCnt);
        else
                strcpy(stErrInfo.szErrMsg,"[0739] 本日无批量扣费入帐!");
                sprintf(stErrInfo.szErrCmt,"[0773] 取账号(%s)信息错", zhdh);
                PCLog(TLEVEL," %s!\n", stErrInfo.szErrCmt);
                sprintf(stErrInfo.szErrCmt, "[0783] 获取 %s 账户科目错",  kmxx->kmdh);
                PCLog(TLEVEL," %s!\n", stErrInfo.szErrCmt);

其中 sprintf() 之外的语句就不是我需要的处理内容.

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
5 [报告]
发表于 2011-05-24 08:17 |只看该作者
本帖最后由 yinyuemi 于 2011-05-24 08:29 编辑

回复 4# ljmmail


    Try:
  1. awk -vRS="sprintf([^;]*);" '{print RT}'
复制代码

论坛徽章:
0
6 [报告]
发表于 2011-05-24 23:28 |只看该作者
还是不行的, 没有看到后面的赋值变量
sprintf(selString, "select rowid  from  %s into temp  tmp_ghinst ;
sprintf(insString, "insert into %s  select * from %s a where a.rowid in "
                        "(select * from tmp_ghinst b where b.rowid >=%ld and b.rowid <%ld )  %s ;
sprintf(selString, "select rowid  from  %s where %s into temp tmp_pcldele ;

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
7 [报告]
发表于 2011-05-24 23:43 |只看该作者
回复 6# ljmmail


    那是因为你要的内容里包含;
再试试:
  1. awk -vRS="sprintf([^)]*);" '{print RT}'
复制代码

论坛徽章:
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
8 [报告]
发表于 2011-05-25 14:00 |只看该作者
回复 4# ljmmail


改成 awk '/sprintf/,/;/' *.c

论坛徽章:
0
9 [报告]
发表于 2011-05-25 21:41 |只看该作者
实验后, 发现可以使用
awk '/sprintf/,/);/'   *.c
将检索的结束标志设置为  );  这样就没有问题了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP