计算整个文件中子串的出现次数

时间:2014-11-30 15:06:51

标签: linux shell awk

例如,我有一个文件log.txt,内容可能是

GetData() starts                 2014-11-30 17:05   
GetData(100) ends                2014-11-30 17:05     
printf("") starts                2014-11-30 17:05 
printf() ends                    2014-11-30 17:06
UpdateScreen(xxx) starts         2014-11-30 17:06
UpdateScreen(xx) end             2014-11-30 17:06
GetData() starts                 2014-11-30 17:06
GetData(100) ends                2014-11-30 17:06

对于每个函数名,我想计算整个文件中的出现次数,并将统计信息输出到output.txt。

output:
GetData: 4
Printf: 2
UpdateScreen: 2

如何通过像awk这样的linux shell命令来做到这一点?

更新
()中的文本是传递给函数的参数,因此它们是动态的,这意味着对同一GetData的调用可能会留下不同的日志,例如GetData(5)end,或GetData(100)或GetData( 1000)。这也与其他功能相同。

我想获得每个函数的总计数,因此GetData(2)和GetData(100)将被视为相同类型的GetData。

2 个答案:

答案 0 :(得分:3)

这样的东西
$ awk -F"(" '{count[$1]++} END{for ( i in count) print i": "count[i]}' input
UpdateScreen: 2
GetData: 4
printf: 2

它的作用是什么?

  • -F"("将字段分隔符设置为(

  • count[$1]++创建一个由第1列索引的数组count$1函数名称

  • for ( i in count) print i": "count[i]}打印数组的内容

答案 1 :(得分:0)

grep -oP '^\w+' input | sort | uniq -c | sort -nr > output.txt
  1. grep ... - 获取函数名称
  2. 排序| uniq -c - 计算Ocurrences
  3. sort -nr - 命令它们出现