用于查看流中前 N 个项目的工具

用于查看流中前 N 个项目的工具

我正在寻找可以完成以下任务的现有 Linux 命令行工具:

考虑有一个输入流/dev/inputstream喷出无限的数据流,如下所示:

A
A
B
A
C
Z
A
.
.
.

笔记:(每一行是字母表中的一个字符)。

该工具的使用方式如下:

cat /dev/inputstream | tool

该工具的输出应该类似于“top”命令的输出。它应该是一个不断更新的前 N ​​个频繁出现项目的列表。

例如:

A -- 10 times
B -- 8 times
Z -- 7 times
C -- 2 times
D -- 1 time

如果流不是无限的,我可以使用sort和来完成此操作uniq

答案1

我发现这个工具完全符合我的需求,叫做logtop。根据文档:

logtop显示标准输入中接收到的字符串的实时计数。

例子

对于某些情况很有用,例如让 IP 淹没您的服务器:

$ tail -f /var/log/apache2/access.log | cut -d' ' -f1 | logtop

或者您博客中最热门的文章:

$ tail -f /var/log/apache2/access.log | cut -d' ' -f7 | grep article | logtop

Fedora/CentOS/RHEL

我找不到该应用程序的 RPM,但手动下载、编译和安装非常简单。它确实需要安装 2 个依赖项才能编译它。

$ sudo yum install uthash ncurses-devel

您可以从 Github 下载该软件:

$ git clone https://github.com/JulienPalard/logtop.git

构建它:

$ cd logtop
$ make

然后您可以安装它或从此目录运行它./logtop

例子

$ tr -dc 'A-Z' </dev/urandom | fold -w 1 | head -n 10MB | ./logtop
10000 lines, 10000.00 lines/s
RANK    CNT   LINE/S LINE                                                                                                                             
   1    428   428.00 T
   2    417   417.00 G
   3    416   416.00 S
   4    414   414.00 K
   5    413   413.00 Q
   6    412   412.00 E
   7    401   401.00 I

答案2

在 Perl 中:

perl -nle '
          $N = 5;      # Change as needed
          $freq{$_}++;
          if ( keys %freq >= $N ){
              @sorted = sort { $freq{$b} <=> $freq{$a} } keys %freq;
              for ( 0..$N-1){
                  $key = $sorted[$_];
                  print "$key -- $freq{$key} times";
              }
          }
          sleep 5;
          system(clear)
          ' < /dev/inputstream

相关内容