9

我有一个服务器访问日志,带有每个 http 请求的时间戳,我想获得每秒请求数的计数。使用sed, 和cut -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
22- 2008 年 9 月 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>

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

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

4

6 回答 6

32

我想你正在寻找

uniq --count

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

于 2008-09-24T17:04:23.227 回答
1

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

于 2008-09-24T17:08:21.080 回答
1

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

uniq -c logfile | sed 's/\([0-9]+\)\(.*\)/\2: \1/'
于 2008-09-24T17:15:51.623 回答
0

使用awk

cat file.txt | awk '{count[$1 " " $2]++;} \
                    END {for(w in count){print w ": " count[w]};}'
于 2008-10-02T08:11:25.943 回答
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
于 2015-10-01T13:05:55.733 回答
-2

也许使用xargs?不能在这里当场将所有内容放在我的脑海中,但是在您的 sort -u 上使用 xargs 以便对于每个唯一的秒,您可以 grep 原始文件并执行 wc -l 来获取数字。

于 2008-09-24T17:04:50.777 回答