awk 文本处理实战:从入门到高效处理日志
在 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 能不能一行解决,往往能省下不少写脚本的时间。
- 点赞
- 收藏
- 关注作者
评论(0)