计算文件中令牌的出现次数

时间:2008-09-24 16:59:26

标签: bash shell grep

我有一个服务器访问日志,每个http请求的时间戳,我想获得每秒请求数的计数。使用sedcut -c,到目前为止,我已设法将文件缩减为时间戳,例如:

  

2008年9月22日20:00:21 +0000
  2008年9月22日20:00:22 +0000
  2008年9月22日20:00:22 +0000
  2008年9月22日20:00:22 +0000
  2008年9月22日20:00:24 +0000
  2008年9月22日20:00:24 +0000

我最想得到的是每个唯一时间戳在文件中出现的次数。例如,通过上面的示例,我想获得看起来像的输出:

  

2008年9月22日20:00:21 +0000:1
  2008年9月22日20:00:22 +0000:3
  2008年9月22日20:00:24 +0000:2

我已经使用sort -u将时间戳列表过滤到唯一标记列表,希望我可以使用像

这样的grep
grep -c -f <file containing patterns> <file>

但这只会产生一条总共匹配线的单行。

我知道这可以在一行中完成,将一些实用程序串在一起......但我想不出哪个。有人知道吗?

6 个答案:

答案 0 :(得分:32)

我认为你正在寻找

uniq --count
  

-c, - count           前缀行数出现次数

答案 1 :(得分:1)

将AWK与关联数组一起使用可能是另类解决方案。

答案 2 :(得分:1)

以防万一你希望以最初指定的格式输出(最后出现的数量):

uniq -c logfile | sed 's/\([0-9]+\)\(.*\)/\2: \1/'

答案 3 :(得分:0)

使用awk

cat file.txt | awk '{count[$1 " " $2]++;} \
                    END {for(w in count){print w ": " count[w]};}'

答案 4 :(得分:0)

汤姆的解决方案:

awk '{count[$1 " " $2]++;} END {for(w in count){print w ": " count[w]};}' file.txt

更常见。

我的文件没有排序:

name1 
name2 
name3 
name2 
name2 
name3 
name1

因此,事件并未相互发生,并且uniq无法正常工作:

1 name1 
1 name2 
1 name3 
2 name2 
1 name3 
1 name1

然而,使用awk脚本:

name1:2 
name2:3 
name3:2

答案 5 :(得分:-2)

也许使用xargs?不能把它全部放在我的头上,但是在你的排序-u上使用xargs,这样每个唯一的第二个你可以grep原始文件并做一个wc -l来获取数字。