前言
awk 是 Linux 运维四剑客的数据分析与文本格式化之王,相较于 grep 的过滤、sed 的替换修改,awk 主打 分段、切片、计算、统计、格式化输出。
运维标准体系:find 找文件 → grep 过滤行 → sed 修改行 → awk 解析字段。awk 支持类 C 语言语法、变量、条件判断、循环、数组运算,是日志分析、流量统计、数据清洗、报表生成、系统巡检的终极工具。本文基于生产场景,从零拆解 awk 原理、内置变量、动作语法、实战案例、自动化脚本及高阶避坑要点。
一、awk 核心原理与基础语法
1.1 工作原理
awk 采用 逐行读取、字段切割、模式匹配、逻辑运算、结果输出 的处理机制:
将每行文本默认以空格/制表符切割为多个字段,依次赋值给 $1 $2 $3 ... $NF 变量,通过自定义匹配规则与逻辑代码,实现字段筛选、数据计算、格式重组、统计汇总,默认不修改原文件,仅做数据解析输出。
核心优势:天然字段分割、支持数值运算、逻辑判断能力强、可编写轻量脚本、超大日志文件分析效率极高;核心场景:Nginx日志分析、系统数据统计、文本结构化、批量数据计算、运维报表输出。
1.2 标准基础语法
awk [参数] 'BEGIN{初始化逻辑} 匹配模式{执行动作} END{收尾逻辑}' 目标文件
BEGIN{}:读取文件前执行,仅执行一次,用于初始化变量、设置分隔符、打印表头
匹配模式{}:逐行匹配执行,核心逻辑,支持正则、条件、范围匹配
END{}:文件读取完毕后执行,仅执行一次,用于汇总统计、打印结尾结果
二、awk 高频常用参数
参数 | 作用说明 | 生产场景 |
|---|
-F | 指定字段分隔符,支持单个字符、正则 | 解析逗号、冒号、竖线分隔的结构化文本(csv、配置、日志) |
-v | 定义外部变量,传入awk内部使用 | 脚本动态传参、自定义阈值筛选数据 |
-f | 读取awk脚本文件执行逻辑 | 复杂统计逻辑复用、规范化脚本编写 |
-W | 扩展参数,支持兼容、正则优化 | 解决特殊字符分割、编码兼容问题 |
三、awk 核心内置变量
内置变量是 awk 字段解析的核心,生产使用率100%,必须熟练掌握:
四、awk 基础匹配与动作语法
4.1 无条件匹配
# 打印文件所有行(等价cat) awk '{print $0}' test.txt
4.2 条件匹配(布尔判断)
# 第二字段等于root的行 awk '$2=="root"{print $0}' test.txt # 字段数值大于100的行 awk '$3>100{print $0}' test.txt # 多条件与匹配 awk '$3>10 && $4!="0"{print $0}' test.txt
4.3 正则匹配
# 整行包含error关键字 awk '/error/{print $0}' app.log # 第5字段包含2026时间 awk '$5~/2026/{print $0}' app.log # 正则不匹配(反向过滤) awk '!/debug/{print $0}' app.log
五、awk 零基础实战示例
5.1 字段切割与提取
# 1. 默认空格分割,提取第1、3字段 awk '{print $1,$3}' access.log # 2. 指定冒号分割,解析/etc/passwd,提取用户名、UID awk -F: '{print "用户名:"$1,"UID:"$3}' /etc/passwd # 3. 打印每行最后一个字段 awk '{print $NF}' test.txt # 4. 打印倒数第二个字段 awk '{print $(NF-1)}' test.txt # 5. 自定义输出分隔符(以逗号分隔输出) awk -v OFS="," '{print $1,$2}' test.txt
5.2 行号、数量统计
# 1. 打印行号+内容 awk '{print NR,$0}' test.txt # 2. 统计文件总行数 awk 'END{print "总行数:"NR}' test.txt # 3. 统计有效字段大于5的行数 awk 'NF>5{count++}END{print "有效行数:"count}' test.txt
5.3 系统运维高频命令
# 1. 统计服务器监听端口数量 netstat -tulpn | awk '{print $4}' | grep -v "^$" # 2. 查看进程CPU使用率排行 ps -ef | awk '{print $2,$3,$8}' # 3. 过滤空行(NF为0是空行,取反过滤) awk 'NF!=0' test.txt # 4. 过滤注释行+空行(配置文件提纯) awk '!/^#/ && NF>0' nginx.conf
六、awk 高阶扩展
awk 区别于普通文本命令的核心:支持变量累加、if判断、for循环、数组去重统计,可独立完成日志数据分析。
6.1 数值累加统计
# 统计日志中所有流量大小总和(假设第10字段为流量值) awk '{sum+=$10}END{print "总流量:"sum/1024/1024,"MB"}' access.log
6.2 If 条件分支判断
# 根据状态码区分请求成功/失败(假设第9字段为HTTP状态码) awk '{ if($9==200) ok++; else if($9>=400 && $9<500) client_err++; else if($9>=500) server_err++; }END{ print "成功请求:"ok; print "客户端错误:"client_err; print "服务端错误:"server_err; }' nginx.log
6.3 数组去重统计
用于统计 IP 访问量、接口请求次数、异常报错频次,是日志分析核心用法。
# 统计每个IP的访问次数(第1字段为客户端IP) awk '{ip[$1]++}END{for(i in ip) print ip[i],i}' access.log | sort -nr
七、四剑客联动高阶组合(find+grep+sed+awk)
生产标准自动化链路:检索文件 → 过滤内容 → 清洗文本 → 结构化分析
# 1. 批量分析所有历史压缩日志IP访问排行 find /var/log/nginx -name "*.gz" -exec zgrep -h "200" {} \; | awk '{ip[$1]++}END{for(i in ip)print ip[i],i}' | sort -nr # 2. 提纯配置并统计有效配置行数 cat /etc/nginx/nginx.conf | grep -v "^#" | sed '/^$/d' | awk 'END{print "有效配置行数:"NR}' # 3. 筛选高CPU占用进程(CPU占比大于10%) ps -aux | awk '$3>10{print $0}'
八、完整实战脚本
8.1 Nginx日志访问分析脚本
一键统计站点总请求、成功/失败量、TOP10访问IP、异常请求数,适配日常运维巡检。
#!/bin/bash # Nginx日志智能分析脚本 LOG_PATH="/var/log/nginx/access.log" echo "========== Nginx 日志分析报告 $(date +%Y-%m-%d\ %H:%M:%S) ==========" # 1. 总请求量 echo -e "\n1. 今日总请求量:" awk 'END{print NR}' ${LOG_PATH} # 2. 状态码分布统计 echo -e "\n2. HTTP状态码统计:" awk '{ if($9~/^2/) code_2xx++; else if($9~/^3/) code_3xx++; else if($9~/^4/) code_4xx++; else if($9~/^5/) code_5xx++; }END{ print "2xx成功请求:",code_2xx+0; print "3xx跳转请求:",code_3xx+0; print "4xx客户端错误:",code_4xx+0; print "5xx服务端错误:",code_5xx+0; }' ${LOG_PATH} # 3. TOP10访问IP echo -e "\n3. 访问量TOP10客户端IP:" awk '{ip[$1]++}END{for(i in ip)print ip[i],i}' ${LOG_PATH} | sort -nr | head -10 echo -e "\n========== 分析结束 =========="
8.2 系统资源巡检脚本
一键统计内存、CPU占用最高进程,快速定位服务器资源瓶颈。
#!/bin/bash # 系统资源瓶颈巡检脚本 echo "========== 资源占用TOP5进程 ==========" ps -aux | sort -k3 -nr | head -5 | awk '{ printf "进程名:%-15s PID:%-8s CPU占比:%-5s 内存占比:%-5s\n",$11,$2,$3,$4 }'
九、避坑要点
字符串匹配必须全等判断:精准匹配使用 $1=="root",正则匹配使用 $1~/root/,切勿混用。
默认自动忽略首尾空格:awk 切割字段会自动忽略首尾多余空格,比 cut 命令更稳定,生产优先用 awk 切割文本。
空行过滤优先 NF>0:不要用正则匹配空行,NF>0可精准过滤所有空行,适配所有文本场景。
数值运算自动识别类型:awk 会自动识别字段为数字/字符串,无需手动类型转换,统计计算极简高效。
数组遍历无序:for 遍历结果无序,需搭配 sort 排序输出可视化结果。
BEGIN与END仅执行一次:初始化参数、打印表头放 BEGIN,汇总统计、输出结果放 END,逐行逻辑放主代码块。
多分隔符使用正则:同时匹配多个分隔符(空格+冒号+逗号),可使用 -F "[ :,]" 批量切割。
十、find / grep / sed / awk四剑客完整场景分工
至此四大核心命令讲解完毕,明确场景边界,彻底告别误用:
find:文件维度——遍历磁盘、筛选文件、批量操作文件属性
grep/egrep/zgrep:内容过滤——关键字检索、日志筛选、正则匹配行
sed:文本修改——批量替换、删行、插入内容、配置清洗
awk:数据解析——字段切割、数值统计、数据汇总、结构化报表
终极流水线:find 找文件 → grep 筛有效行 → sed 清洗脏数据 → awk 统计分析出报表
总结
awk 是 Linux 文本处理体系中能力最强、自由度最高的命令,脱离单纯的文本过滤与修改,具备轻量脚本的编程能力。熟练掌握内置变量、条件判断、数组统计、三剑客联动,可实现日志自动化分析、系统资源巡检、数据清洗报表等核心运维场景,是普通运维进阶高级自动化运维的标志性技能。