计算流中的重复行

计算流中的重复行

我目前正在使用该命令解析 apache 日志:

tail -f /opt/apache/logs/access/gvh-access_log.1365638400  | 
grep specific.stuff. | awk '{print $12}' | cut -d/ -f3 > ~/logs

输出是域列表:

www.domain1.com
www.domain1.com
www.domain2.com
www.domain3.com
www.domain1.com

然后在另一个终端运行以下命令:

watch -n 10 'cat ~/logs | sort | uniq -c | sort -n | tail -50'

输出为:

1023 www.domain2.com
2001 www.domain3.com
12393 www.domain1.com

我用它来监控准实时 Apache 统计数据。问题是它logs很快就会变得非常大。除了这个之外,我不需要日志用于任何其他目的uniq -c

我的问题是:有什么方法可以避免使用临时文件?我不想用我选择的语言手动滚动自己的计数器,awk如果可能的话,我愿意使用一些魔法。

请注意,由于我需要使用sort,因此我必须在过程中使用临时文件,因为对流进行排序是没有意义的(尽管 uniq 不是)。

答案1

尽管它可能指出了显而易见的问题,但是你尝试过这样做吗:

tail -f /opt/apache/logs/access/gvh-access_log.1365638400  | grep specific.stuff. | awk '{print $12}' | cut -d/ -f3 | sort | uniq | sort -n | tail -50

我知道这是一条很长的命令行,但它可以避免创建中间文件。如果这对您不起作用,请您告诉我原因,这样您就可以得到更有意义的答案。

相关内容