Bash 计算文件中令牌的出现次数
我有一个服务器访问日志,带有每个http请求的时间戳,我想获得每秒请求数的计数。使用Bash 计算文件中令牌的出现次数,bash,shell,grep,Bash,Shell,Grep,我有一个服务器访问日志,带有每个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 2008年9月22日20:00:24+0000 2008年9月22日20:00:24+0000 我想得到的是每个唯一时间戳在文件中出现的次数。例如,
sed
和cut-c
,到目前为止,我已成功地将文件缩减到仅包含时间戳,例如:
2008年9月22日20:00:21+00002008年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>
grep-c-f
但这只产生了一行匹配行的总和
我知道这可以在一条线上完成,将一些实用程序串在一起。。。但我想不出是哪个。有人知道吗?我想你在找
uniq --count
-c、 --伯爵
按出现次数为行添加前缀
也许使用xargs?在这里,我不能把所有的东西都放在我的脑海里,但是在你的sort-u上使用xargs,这样每一秒你都可以把原始文件变灰,然后做一个wc-l来获得数字 将AWK与关联数组一起使用可能是解决类似问题的另一种解决方案。以防您希望以最初指定的格式输出(出现次数在末尾): 使用: 汤姆的解决方案:
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
请注意,对于其他数据集,您可能需要在uniq(1)之前对(1)进行排序,因为uniq只会对相邻的重复项进行分组。是的,但OP已经说他已经对事物进行了排序,所以我假设他是这类事物的最高级……我不得不在OSX上使用
uniq-c
,--count
给了我一个错误。
1 name1
1 name2
1 name3
2 name2
1 name3
1 name1
name1:2
name2:3
name3:2