3

摘要:有没有办法比使用更有效地从文件中获取唯一行和出现次数sort | uniq -c | sort -n

详细信息:在进行日志分析时,我经常使用管道来sort | uniq -c | sort -n了解哪些日志条目显示最多/最少等的总体趋势。这在大多数情况下都有效 - 除非我正在处理一个非常大的日志文件,最终大量重复(在这种情况下sort | uniq -c最终需要很长时间)。

示例:我现在面临的具体情况是从“未参数化”的 mysql bin 日志中获取趋势,以找出运行次数最多的查询。对于一个包含一百万个条目的文件,我通过 grep/sed 组合来删除参数 - 产生大约 150 条独特的行 - 我花费了大约 3 秒的 grepping 和 sedding,以及大约 15 秒的排序/uniq'ing。

目前,我已经解决了一个简单的 c++ 程序,该程序维护 < line, count > 的映射 - 它在不到一秒的时间内完成了这项工作 - 但我想知道现有的实用程序是否已经存在。

4

1 回答 1

6

我不确定性能差异是什么,但您可以sort | uniq -c用一个简单的awk脚本替换。由于您有很多重复项并且它是散列而不是排序,我想它会更快:

 awk '{c[$0]++}END{for(l in c){print c[l], l}}' input.txt | sort -n
于 2012-06-24T01:55:31.980 回答