Kok*_*zzu 253 command-line sort
我有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
Run Code Online (Sandbox Code Playgroud)
我想要的结果是:
3 a.php
2 b.php
1 d.php # order doesn't matter
1 c.php
Run Code Online (Sandbox Code Playgroud)
小智 328
| sort | uniq -c
Run Code Online (Sandbox Code Playgroud)
如评论中所述。
将输出管道sort化为按字母/数字顺序组织输出。
这是一个要求,因为uniq只匹配重复的行,即
a
b
a
Run Code Online (Sandbox Code Playgroud)
如果您uniq在此文本文件上使用,它将返回以下内容:
a
b
a
Run Code Online (Sandbox Code Playgroud)
这是因为两个as 被 - 分隔,b它们不是连续的行。但是,如果您首先将数据按字母顺序排序,例如
a
a
b
Run Code Online (Sandbox Code Playgroud)
然后uniq将删除重复行。该-c的选项uniq计数重复的数量,并提供输出形式:
2 a
1 b
Run Code Online (Sandbox Code Playgroud)
参考:
Edu*_*scu 176
[your command] | sort | uniq -c | sort -nr
Run Code Online (Sandbox Code Playgroud)
接受的答案几乎完整,您可能希望sort -nr在最后添加一个额外的内容,以使用最常出现的行对结果进行排序
唯一选项:
-c, --count
prefix lines by the number of occurrences
Run Code Online (Sandbox Code Playgroud)
排序选项:
-n, --numeric-sort
compare according to string numerical value
-r, --reverse
reverse the result of comparisons
Run Code Online (Sandbox Code Playgroud)
在特定情况下,您正在排序的行是数字,您需要使用sort -gr而不是sort -nr,请参阅评论
小智 21
您可以在awk上使用关联数组,然后 - 可选地 -排序:
$ awk ' { tot[$0]++ } END { for (i in tot) print tot[i],i } ' access.log | sort
Run Code Online (Sandbox Code Playgroud)
输出:
1 c.php
1 d.php
2 b.php
3 a.php
Run Code Online (Sandbox Code Playgroud)
小智 5
在本例中,您可以使用clickhouse-client工具来处理文件,例如处理具有单列的 sql 表:
clickhouse-local --query \
"select data, count() from file('access.log', TSV, 'data String') group by data order by count(*) desc limit 10"
Run Code Online (Sandbox Code Playgroud)
我的简短实验表明它比
cat access.log | sort | uniq -c | sort -nr | head 10
Run Code Online (Sandbox Code Playgroud)