awk本身不直接提供排序功能,但可灵活预处理、分组、计算和格式化数据,再配合sort实现多列排序与汇总;典型场景包括按多列排序(如响应码升序→字节数降序)和按多列分组汇总(如用户+操作类型统计次数、求和等),并支持带标题的排序报表生成。

awk 本身不直接提供排序功能(不像 sort 那样内置多列稳定排序),但它能灵活地预处理、分组、计算和格式化数据,再配合 sort 实现“按多列排序与汇总”的完整流程。实际工作中,awk 和 sort 常组合使用——awk 负责提取、转换、聚合;sort 负责按多列精确排序;必要时再用 awk 做最终整理。
下面分两类场景说明:多列排序 和 多列分组汇总,每类都给出清晰、可直接运行的命令示例。
按多列排序(先提取再排序)
awk 不替代 sort,但可帮你准备适合排序的字段结构(比如补零、统一格式、提取关键列)。
例如日志中含 IP、时间戳、响应码、字节数,想按「响应码升序 → 字节数降序」排列:
awk -F' ' '{print $9, $10, $1}' access.log | \
sort -k1,1n -k2,2nr -k3,3 | \
awk '{print "Code:" $1 ", Size:" $2 ", IP:" $3}'
- 第一个
awk提取第9列(状态码)、第10列(字节)、第1列(IP),用空格分隔; -
sort -k1,1n表示按第1字段数字升序;-k2,2nr表示按第2字段数字降序;-k3,3表示按第3字段字典序升序; - 最后一个
awk重新格式化输出,增强可读性。
✅ 关键点:
-k start,end精确控制每列范围;n表示数值排序(避免"10"排在"2"前);r表示逆序。
linux-sysadmin下载Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
按多列分组汇总(计数、求和、去重等)
awk 擅长以多列为键做聚合,例如按「用户+操作类型」统计次数:
假设有如下 action.log:
alice login 2024-01-01 bob upload 2024-01-01 alice login 2024-01-02 alice download 2024-01-02 bob login 2024-01-02
统计「用户+操作」组合出现次数:
awk '{key = $1 "," $2; count[key]++} END {for (k in count) print k, count[k]}' action.log | \
sort -t',' -k1,1 -k2,2
-
$1 "," $2拼出复合键(如alice,login); -
count[key]++自动累计; -
END遍历并输出; -
sort -t',' -k1,1 -k2,2按第1段(用户名)、第2段(操作)字典序排序。
你还可以扩展为求和:
若第三列是耗时毫秒数,想算每个「用户+操作」的总耗时:
awk '{key = $1 "," $2; sum[key] += $3; cnt[key]++} END {for (k in sum) print k, sum[k], cnt[k]}' action.log | \
sort -t',' -k1,1 -k2,2
进阶技巧:带标题的汇总表 + 排序
想生成带表头、按数值排序的报表?可用 BEGIN 输出标题,再用 sort 后处理:
awk 'BEGIN{print "User,Action,Total,Count"}
{key = $1 "," $2; sum[key] += $3; cnt[key]++}
END{for (k in sum) print k "," sum[k] "," cnt[k]}' action.log | \
sort -t',' -k1,1 -k2,2 -k3,3nr | \
column -t -s','
-
column -t -s','自动对齐 CSV 格式输出; -
-k3,3nr让「Total」列数值降序排(最耗时的操作排前面)。
不复杂但容易忽略:awk 的聚合依赖内存,超大文件建议先用 sort -k1,1 -k2,2 | uniq -c 配合 awk 做后续加工,更省内存。











