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

时间:2020-03-06 14:40:29  来源:igfitidea点击:

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

22-Sep-2008 20:00:21 +0000

  22-Sep-2008 20:00:22 +0000

  22-Sep-2008 20:00:22 +0000

  22-Sep-2008 20:00:22 +0000

  22-Sep-2008 20:00:24 +0000

  22-Sep-2008 20:00:24 +0000

我想得到的是每个唯一时间戳出现在文件中的次数。例如,在上面的示例中,我想获取如下所示的输出:

22-Sep-2008 20:00:21 +0000: 1

  22-Sep-2008 20:00:22 +0000: 3

  22-Sep-2008 20:00:24 +0000: 2

我已经使用sort -u来过滤时间戳列表到唯一的令牌列表,希望我可以像这样使用grep。

grep -c -f <file containing patterns> <file>

但这只会产生全部匹配行中的一行。

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

解决方案

我想你在找

uniq --count
-c, --count
          prefix lines by the number of occurrences

也许使用xargs?不能当场将所有内容放在一起,而是在排序-u时使用xargs,这样一秒钟,我们就可以grep原文件并执行wc -l以获得数字。

对关联数组使用AWK可能是解决此类问题的另一种方法。

万一我们希望以最初指定的格式输出(末尾出现的次数),以防万一:

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

使用awk:

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