排序并统计行出现的次数

排序并统计行出现的次数

我有Apache日志文件access.log,如何计算该文件中出现的行数?例如,结果cut -f 7 -d ' ' | cut -d '?' -f 1 | tr '[:upper:]' '[:lower:]'

a.php
b.php
a.php
c.php
d.php
b.php
a.php

我想要的结果是:

3 a.php
2 b.php
1 d.php # order doesn't matter
1 c.php 

答案1

| sort | uniq -c

正如评论中所述。

通过管道将输出sort组织为按字母/数字顺序排列的输出。

这是一个要求,因为uniq仅匹配重复的行,即

a
b
a

如果您uniq在此文本文件上使用,它将返回以下内容:

a
b
a

这是因为两个as 由 - 分隔b,它们不是连续的行。但是,如果您首先将数据按字母顺序排序,例如

a
a
b

然后uniq将删除重复的行。选项-c计算uniq重复项的数量并提供以下形式的输出:

2 a
1 b

参考:

答案2

[your command] | sort | uniq -c | sort -nr

接受的答案几乎是完整的,您可能需要sort -nr在末尾添加一个额外的内容,以将最常出现的行排在最前面

独特的选项:

-c, --count
       prefix lines by the number of occurrences

种类选项:

-n, --numeric-sort
       compare according to string numerical value
-r, --reverse
       reverse the result of comparisons

在特定情况下,如果您要排序的行是数字,则需要使用sort -gr而不是sort -nr,请参阅评论

答案3

您可以使用关联数组awk然后-可选-种类:

$ awk ' { tot[$0]++ } END { for (i in tot) print tot[i],i } ' access.log | sort

输出:

1 c.php
1 d.php
2 b.php
3 a.php

答案4

只有 1 个样本d.php。所以你会得到像这样的漂亮输出。

wolf@linux:~$ cat file | sort | uniq -c
      3 a.php
      2 b.php
      1 c.php
      1 d.php
wolf@linux:~$

当有 4 时会发生什么d.php

wolf@linux:~$ cat file | sort | uniq -c
      3 a.php
      2 b.php
      1 c.php
      4 d.php
wolf@linux:~$ 

如果您想按出现次数对输出进行排序,您可能需要sort再次发送标准输出。

wolf@linux:~$ cat file | sort | uniq -c | sort
      1 c.php
      2 b.php
      3 a.php
      4 d.php
wolf@linux:~$ 

用于-r反向

wolf@linux:~$ cat file | sort | uniq -c | sort -r
      4 d.php
      3 a.php
      2 b.php
      1 c.php
wolf@linux:~$ 

希望这个例子有帮助

相关内容