基础工具组合:sort
+ uniq
适用场景:统计文本文件中重复行的出现次数(如日志错误类型统计)。
原理:先排序使相同行相邻,再用uniq
合并计数。
步骤:
# 按频次降序排序(最频繁的排在最前) sort words.txt | uniq -c | sort -nr
关键参数:
uniq -c
:在每行前添加出现次数。sort -nr
:按数值(-n
)逆序(-r
)排序。
示例输出:
5 Connection timeout
3 Invalid user
1 Login success
高级文本处理:awk
适用场景:复杂统计(如按列分组统计、条件过滤)。
原理:awk
逐行处理文本,用关联数组计数。
示例命令:
# 统计第一列值的频次(如统计IP访问次数) awk '{count[$1]++} END {for (ip in count) print count[ip], ip}' access.log # 带条件统计(只统计状态码为404的请求) awk '/ 404 / {count[$7]++} END {for (url in count) print count[url], url}' access.log
优势:
- 灵活指定统计字段(
$1
为第一列,$NF
为最后一列)。 - 支持正则过滤(如
/404/
匹配包含”404″的行)。
实时流处理:grep
+ 管道
适用场景:动态统计日志流中的关键词(如监控错误消息)。
命令示例:
# 实时统计包含 "ERROR" 的行 tail -f app.log | grep -c "ERROR" # 分类统计(统计不同错误类型) tail -f app.log | awk '/ERROR/ {type=$4; count[type]++} END {for (t in count) print count[t], t}'
高效专用工具:datamash
适用场景:结构化数据统计(需安装:sudo apt install datamash
)。
功能:支持分组、求和、频次统计等。
示例:
# 按第一列分组统计频次 datamash -s -g 1 count 1 < data.csv # 输出示例: # GroupBy(field1) count(field1) # admin 12 # user 48
常见问题与解决方案
-
乱序统计结果
- 原因:
uniq
需输入已排序的数据。 - 解决:始终先
sort
再uniq -c
。
- 原因:
-
大小写敏感
- 方法:统计前统一转为小写。
sort file.txt | tr '[:upper:]' '[:lower:]' | uniq -c
- 方法:统计前统一转为小写。
-
统计特定字符(非整行)
- 示例:统计字母
a
的出现次数。grep -o 'a' file.txt | wc -l
- 示例:统计字母
-
处理大文件性能优化
- 使用
LC_ALL=C sort
提升排序速度(禁用本地化规则)。 - 用
awk
替代多步管道,减少I/O开销。
- 使用
Linux命令行提供多种灵活的频次统计方案:
- 简单计数:
sort | uniq -c
快速可靠。 - 复杂分析:
awk
满足条件过滤、多列统计。 - 实时监控:管道组合
tail
、grep
实现动态分析。 - 结构化数据:
datamash
提供类SQL功能。
掌握这些方法可高效处理日志分析、数据清洗等任务,充分体现Linux工具链的强大与高效,建议通过man sort
、man awk
等查阅手册深化理解。
引用说明:本文方法基于GNU核心工具集(sort, uniq, awk)的标准实现,参考Linux man-pages(手册页)及开源社区最佳实践,数据统计原理遵循信息论与文本处理基础理论。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/4419.html