请教:如何用shell实现指定log文件(比如a.log)中的指定内容(SQL_ID和SQL的处理部分)的收集

Linuxgreenhand 2010-08-04 09:45:56
目的:收集指定Log文件里会多次出现以下的SQL_ID和SQL的处理部分并且统计各个SQL_ID和SQL的处理部分的出现次数。

(例:指定Log文件的一部分)
SQL_ID 0saby2c3v1z0u, child number 0
-------------------------------------
-- SELECT /* rn.kdbs.action.search.pre.CompanyAction#index */ DBMS_RANDOM.VALUE RANDOM

上面的例子里SQL_ID=0saby2c3v1z0u、SQL的处理部分rn.kdbs.action.search.pre.CompanyAction#index
其中SQL_ID 规定是13位, SQL的处理部分形式也一定是 SELECT /* SQL的处理部分*/ 。而且SQL的处理部分的行一定在SQL_ID的下面两行比如某SQL_ID是100行,那该SQL_ID对应的处理部分肯定出现在102行。
指定Log文件里,一个SQL_ID和SQL的处理部分可能出现1次,也可能重复多次出现。


最终我希望把各个SQL_ID和该SQL的处理部分,以及它们出现的次数用以下的方式输出。
具体输出成txt文件还是csv文件还没考虑好。(好像生成csv文件比较麻烦)
(输出例)
Action名 SQL_ID 回数
rn.kdbs.action.search.pre.CompanyAction1#index 0saby2c3v1z0u 100
rn.kdbs.action.search.pre.CompanyAction2#index 0saby2c3v2z0u 101
rn.kdbs.action.search.pre.CompanyAction3#index 0saby2c3v3z0u 200
rn.kdbs.action.search.pre.CompanyAction4#index 0saby2c3v4z0u 201
rn.kdbs.action.search.pre.CompanyAction5#index 0saby2c3v5z0u 1


望有人能帮忙给出具体的实现,本人感激不尽。
...全文
378 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
masmaster 2010-08-05
  • 打赏
  • 举报
回复
文本处理,可不是shell的强项!
ljc007 2010-08-05
  • 打赏
  • 举报
回复
1楼用的awk命令啊,跟perl有啥关系?
Linuxgreenhand 2010-08-05
  • 打赏
  • 举报
回复
非常感谢楼上的高手。
但我忘记说一点,目前我刚接触shell,只看得懂#!/bin/bash 开始的最普通的shell(Bourne Shell).
基础没打好。实在不敢再学Perl。

因此,能否请您用Bourne Shell来实现这个功能?
麻烦了。
lylm 2010-08-05
  • 打赏
  • 举报
回复
用awk来实现:
!/bin/awk -f
{
if($0 ~ /^SQL_ID/)
{
key=$2;getline;getline l;
split(l,pat,/\/\*/);
split(pat[2],tmp,/\*\//);
#print tmp[1];
key=sprintf("%s%s",key,tmp[1]);x[key]++;
}
}
END{
for(i in x)
printf("%s %d\n",i,x[i]);
}



1.把上面内容存到file1.awk
2.chmod u+x file1.awk //保证有执行权限
3.awk -f file1.awk test //test是你的文件

输出类似:
0saby2c3v1z0u, rn.kdbs.action.search.pre.CompanyAction#index  4
0saby2c3v1t0u, tn.kdbs.action.search.pre.CompanyAction#index 2
lylm 2010-08-05
  • 打赏
  • 举报
回复
grep -v SQL_ID a.log

转成csv也很简单,用EXCEL导入即可
Linuxgreenhand 2010-08-05
  • 打赏
  • 举报
回复
重试了一次以后可以正常运行了。
非常感谢!!
再请教一下,有没有办法只显示类似于下列的统计的结果?(不显示处理过程)

显示结果:
0saby2c3v1z0u, rn.kdbs.action.search.pre.CompanyAction#index 4
0saby2c3v1t0u, tn.kdbs.action.search.pre.CompanyAction#index 2

另外从使用者角度出发的话上面的统计结果是否转化成cvs文件比文本文件效果更好?
都是些初级问题,麻烦了。
lylm 2010-08-05
  • 打赏
  • 举报
回复
用Bourne Shell测试也没有问题啊

你再按照步骤检查一下
注意保存成UNIX格式
Linuxgreenhand 2010-08-05
  • 打赏
  • 举报
回复
我是蔡鸟,让大家见笑了。
我照1楼大大的方法执行后出现以下错误。请问是什么原因呢?

INFO:20035203:TP-Processor3:r2framework.jdbc.log.ExecutionPlanLogger::SELECT /* rn.ent.action.accounts.regist.SchoolDomesticAction#doFixSchool */
awk: file1.awk:3: (FILENAME=2012.log FNR=1) 致命错误: 函数`f' 未定义

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧