当前位置: 技术问答>linux和unix
请教:如何用shell实现指定log文件中的指定内容的收集(续)
来源: 互联网 发布时间:2016-09-18
本文导语: 大家好,菜鸟的我上周发过一个帖子请教关于如何用shell实现指定log文件中的指定内容的收集。 具体请参考http://topic.csdn.net/u/20100804/21/067815c8-c5d6-499c-807e-6d16cb833cc6.html 论坛里的lylm大大给出了下列使用awk的解决方法,...
大家好,菜鸟的我上周发过一个帖子请教关于如何用shell实现指定log文件中的指定内容的收集。
具体请参考http://topic.csdn.net/u/20100804/21/067815c8-c5d6-499c-807e-6d16cb833cc6.html
论坛里的lylm大大给出了下列使用awk的解决方法,在此先向lylm大大再次表示感谢。(本人稍微调整了下输出结果的显示顺序)
file1.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",tmp[1],key);
x[key]++;
}
}
END{
for(i in x)
printf("%s %dn",i,x[i]);
}
根据上面方法的得到的输出结果例:
收集对象的文件的内容...(省略)
sn.kdbs.action.search.pre.CompanyAction#index 0saby2c3v1z0u, 4
rn.kdbs.action.search.pre.CompanyAction#index 0saby2c3v1z0u, 4
tn.kdbs.action.search.pre.CompanyAction#index 0saby2c3v1t0u, 2
(Action名称) (SQL_ID ) (重复次数)
现在但我希望对输出结果的表示进行一些加工(让看得人更舒服)
因此在此请教各位如何实现以下三点
1)目前的程序执行 `awk -f file1.awk 对象文件 `命令后,会先显示一遍对象文件的所有内容之后才显示希望得到的统计结果,请问如果希望只显示统计结果而不显示对象文件的内容的话,应该如何修改file1.awk文件?
2)统计结果依次显示的3列内容分别是 Action名称 SQL_ID 重复次数。在此我希望对第一列也就是ACTION名称的那列进行排序(ABC依次到Z的顺序排)的话,如何实现?
3)目前的程序输出结果里,因为收集对象文件的SQL_ID最后都有个逗号,因此目前的输出结果里第二列的字符串最后也都有个逗号(比如0saby2c3v1z0u,),如何比较简单的把每项的这个逗号给去掉?(SQL_ID肯定是13位的数字+字母)
对比目前的输出结果,我希望修改后的程序输出结果是下面的样子
理想输出例:
rn.kdbs.action.search.pre.CompanyAction#index 0saby2c3v1z0u 4
sn.kdbs.action.search.pre.CompanyAction#index 0saby2c3v1z0u 4
tn.kdbs.action.search.pre.CompanyAction#index 0saby2c3v1t0u 2
希望各位能在目前的程序的基础上修改后实现以上3点。麻烦了。
具体请参考http://topic.csdn.net/u/20100804/21/067815c8-c5d6-499c-807e-6d16cb833cc6.html
论坛里的lylm大大给出了下列使用awk的解决方法,在此先向lylm大大再次表示感谢。(本人稍微调整了下输出结果的显示顺序)
file1.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",tmp[1],key);
x[key]++;
}
}
END{
for(i in x)
printf("%s %dn",i,x[i]);
}
根据上面方法的得到的输出结果例:
收集对象的文件的内容...(省略)
sn.kdbs.action.search.pre.CompanyAction#index 0saby2c3v1z0u, 4
rn.kdbs.action.search.pre.CompanyAction#index 0saby2c3v1z0u, 4
tn.kdbs.action.search.pre.CompanyAction#index 0saby2c3v1t0u, 2
(Action名称) (SQL_ID ) (重复次数)
现在但我希望对输出结果的表示进行一些加工(让看得人更舒服)
因此在此请教各位如何实现以下三点
1)目前的程序执行 `awk -f file1.awk 对象文件 `命令后,会先显示一遍对象文件的所有内容之后才显示希望得到的统计结果,请问如果希望只显示统计结果而不显示对象文件的内容的话,应该如何修改file1.awk文件?
2)统计结果依次显示的3列内容分别是 Action名称 SQL_ID 重复次数。在此我希望对第一列也就是ACTION名称的那列进行排序(ABC依次到Z的顺序排)的话,如何实现?
3)目前的程序输出结果里,因为收集对象文件的SQL_ID最后都有个逗号,因此目前的输出结果里第二列的字符串最后也都有个逗号(比如0saby2c3v1z0u,),如何比较简单的把每项的这个逗号给去掉?(SQL_ID肯定是13位的数字+字母)
对比目前的输出结果,我希望修改后的程序输出结果是下面的样子
理想输出例:
rn.kdbs.action.search.pre.CompanyAction#index 0saby2c3v1z0u 4
sn.kdbs.action.search.pre.CompanyAction#index 0saby2c3v1z0u 4
tn.kdbs.action.search.pre.CompanyAction#index 0saby2c3v1t0u 2
希望各位能在目前的程序的基础上修改后实现以上3点。麻烦了。
|
这么处理一下
$ awk -f file1.awk test|grep -v SQL_ID|sort|sed 's/,//g'
|
2)和3)
awk -f file1.awk 对象文件 | sort | sed 's/,//g'
awk -f file1.awk 对象文件 | sort | sed 's/,//g'