awk 文本处理实战:从入门到高效处理日志

举报
yd_282444815 发表于 2026/11/08 08:22:38 2026/11/08
【摘要】 在 Linux 服务器的日常运维中,文本处理几乎每天都会遇到:分析日志、统计访问量、提取关键字段。awk 就是为这类场景而生的工具,它把每一行文本按字段切分,让我们可以用很短的命令完成复杂的处理,堪称运维人员的瑞士军刀。 一、awk 的基本工作原理awk 读取文件时,会逐行扫描,每一行默认按空白字符切分成多个字段,$1、$2、$3 分别表示第一、第二、第三个字段,$0 表示整行,NF 表示当...

在 Linux 服务器的日常运维中,文本处理几乎每天都会遇到:分析日志、统计访问量、提取关键字段。awk 就是为这类场景而生的工具,它把每一行文本按字段切分,让我们可以用很短的命令完成复杂的处理,堪称运维人员的瑞士军刀。

一、awk 的基本工作原理

awk 读取文件时,会逐行扫描,每一行默认按空白字符切分成多个字段,$1、$2、$3 分别表示第一、第二、第三个字段,$0 表示整行,NF 表示当前行的字段数,NR 表示当前行号。掌握这几个内置变量,就掌握了 awk 的一半。

最简单的用法是打印指定列。例如查看 /etc/passwd 中所有用户名和默认 Shell:

awk -F: '{print $1, $7}' /etc/passwd

-F: 指定冒号为分隔符,{print $1, $7} 输出用户名和 Shell。

二、用 awk 分析访问日志

假设要统计 Nginx 访问日志中访问量最高的十个 IP:

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10

awk 先取出每行的第一个字段,也就是客户端 IP,sort 排序后 uniq -c 计数,再按数量倒序排列,head 取前十行。一行命令就完成了原本需要写脚本才能做的统计。

还可以只看状态码为 500 的请求:

awk '$9 == 500 {print $1, $7}' access.log

$9 是状态码字段,条件写在花括号前面,只有满足条件的行才会被处理,这种写法比 grep 再加工要灵活得多。

三、数值计算与汇总

awk 支持算术运算,适合做简单的汇总。比如统计日志文件的总流量,假设第 10 个字段是响应体大小:

awk '{sum += $10} END {print "总流量(字节):", sum}' access.log

BEGIN 和 END 是两个特殊的模式,BEGIN 在处理第一行之前执行,常用来初始化变量和打印表头;END 在处理完最后一行后执行,适合输出汇总结果。

四、条件判断与格式化输出

结合 if 和 printf,可以输出更规整的报表。下面的例子把内存占用超过 80% 的进程找出来:

ps aux | awk '$4 > 80 {printf "进程:%s,内存占用:%s%%\n", $11, $4}'

printf 可以控制对齐和小数位数,输出结果比默认的 print 更易读。

五、常见坑与注意事项

第一,字段分隔符要选对,默认按空白切分,遇到 CSV 文件要加 -F,;第二,单引号和双引号不要混用,awk 程序一般放在单引号里,Shell 变量要在外面拼接;第三,处理大文件时尽量用 awk 自身的判断和汇总,少用管道,避免多次扫描文件。

六、总结

awk 的学习曲线并不陡,先记住 $0、$1、NF、NR、BEGIN、END,再结合几个真实场景多练几次,就能把它变成日常工具。需要处理日志、统计数据或者批量提取字段时,先想想 awk 能不能一行解决,往往能省下不少写脚本的时间。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。