
技术弄巷
前言
在 Linux 运维工作中,日志分析、数据统计、字段提取、报表生成、自动化监控等场景,都离不开一款强大的文本处理工具——awk。它不仅是命令,更是一门微型编程语言,支持变量、判断、循环、数组、函数,能轻松完成 grep、sed 难以实现的复杂逻辑处理。
本文从零开始,系统梳理 awk 的工作流程、语法、内置变量、模式、判断、循环、数组、内置函数,覆盖运维 99% 高频用法,看完即可直接落地生产。
一、awk 工具介绍
工作流程
- 逐行读取
- 使用
$1 $2 $3 ...表示第1、2、3段内容 $0-F
核心作用
文本提取、格式化输出、数据统计、逻辑计算、日志分析
基本语法
awk [选项] '条件{动作}' 文件1 文件2...
- 常用动作:
print(普通打印)、printf(格式化打印)
二、awk 基础使用
1. print 打印(最常用)
# 提取第一段(用户名)
awk -F: '{print $1}' /etc/passwd
# 打印整行
awk -F: '{print $0}' /etc/passwd
# 打印多段
awk -F: '{print $1, $3}' /etc/passwd
# 自定义提示文字
awk -F: '{print "用户名:",$1}' /etc/passwd
# 批量卸载软件
rpm -qa | grep php | awk -F-5 '{print "rpm -e --nodeps", $1}' | bash
2. printf 格式化输出
支持对齐、宽度、换行控制,适合生成规整报表
# 左对齐输出,自动换行
awk -F: '{printf "%-15s %-20s\n",$1,$7}' /etc/passwd
# 磁盘信息格式化输出
df -hT | awk '/^\/dev/{printf "%-12s %-20s %-10s\n",$1,$7,$6}'
三、awk 常用内置变量
示例:
awk -v FS=":"'{print $1}' /etc/passwd
awk -v OFS="---" -F: '{print $1,$7}' /etc/passwd
awk 'NR==3{print}' /etc/passwd
awk '{print $NF}' /etc/passwd
四、awk 自定义变量
使用 -v定义变量,支持字符串、数字
awk -v name="martin"'{print "hello",name}' /etc/fstab
awk -v num=100 '{print num}' /etc/fstab
五、awk 常用处理模式
1. 表达式模式(比较/正则/逻辑)
# UID 1~999
awk -F: '$3>=1&&$3<=999{print $1}' /etc/passwd
# 匹配 nologin 结尾
awk -F: '$7~"/nologin$"{print $1}' /etc/passwd
# 磁盘使用率大于20%
df -hT | awk '/^\/dev/&&+$6>20{print $1,$7,$6}'
2. 正则模式
awk '/^tcp/{print}' netstat.log
awk -F: '/^[rhg]/{print $1}' /etc/passwd
3. 区间模式
# 提取时间段日志
awk '/Sep 26 09:00/,/Sep 26 10:00/{print}' messages
4. BEGIN{}(执行前)
awk 'BEGIN{print "开始统计"}'
5. END{}(执行后,统计必备)
awk '{sum++}END{print sum}' /etc/passwd
六、awk 条件判断
支持 if / if-else / if-elseif
# 判断管理员/普通用户
awk -F: '{if($3==0){print $1,"管理员"}else{print $1,"普通用户"}}' /etc/passwd
# 统计 shell 类型数量
awk -F: '{
if($7=="/bin/bash") b++
else if($7~"nologin") n++
}END{
print "bash:",b,"nologin:",n
}' /etc/passwd
七、awk 循环
支持标准 for 循环,遍历字段
# 输出长度>=5的字段
awk -F: '{for(i=1;i<=NF;i++){if(length($i)>=5)print $i}}' /etc/passwd
八、awk 数组(统计神器)
支持数字/字符串下标,用于IP统计、访问统计、状态统计
# 统计各种shell数量
awk -F: '{sh[$7]++}END{for(i in sh)print i,sh[i]}' /etc/passwd
# 统计TCP连接状态
netstat -antp | awk '/^tcp/{status[$6]++}END{for(i in status)print i,status[i]}'
# 日志UV/访问量统计
awk '{uv[$1]++}END{for(i in uv)print i,uv[i]}' access.log
九、awk 内置函数
示例:
awk 'BEGIN{print length("linux")}'
awk 'BEGIN{print substr("hello",2,3)}'
awk 'BEGIN{system("hostname")}'
awk 'BEGIN{print strftime("%F %T")}'
核心要点总结
- awk 是逐行、分段处理的流式编程语言,运维必备。
-Fprint- 内置变量
NR/NF/FILENAME/FS/OFS大幅简化脚本。 BEGIN/END- 支持if/for/数组,可实现复杂日志分析与计算。
- 数组是 awk 最强能力,用于UV、PV、连接状态、类型统计。
结尾互动
awk 是 Linux 文本处理的终极工具,掌握它,日志分析、数据统计、自动化运维效率直接翻倍!
如果这篇硬核干货对你有帮助,欢迎点赞、在看、转发给身边的运维伙伴,一起提升效率!
关注我,持续更新 Linux 运维、Shell 实战、awk/sed/grep 三剑客、自动化脚本等硬核内容,做最会用工具的高效运维人!

