当前位置:首页>Linux>Linux运维四剑客之awk使用详解

Linux运维四剑客之awk使用详解

  • 2026-09-03 21:13:21
Linux运维四剑客之awk使用详解

前言

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%,必须熟练掌握:

  • 1 3 ...:切割后的第1、2、3...个字段

  • NF:Number of Fields,当前行的字段总数量

  • NR:Number of Record,全局行号,多文件累加计数

  • FNR:单个文件行号,多文件单独计数

  • FS:字段分隔符,默认空格、制表符

  • OFS:输出字段分隔符,默认空格

  • RS:行分隔符,默认换行符

  • ORS:输出行分隔符,默认换行符

四、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 文本处理体系中能力最强、自由度最高的命令,脱离单纯的文本过滤与修改,具备轻量脚本的编程能力。熟练掌握内置变量、条件判断、数组统计、三剑客联动,可实现日志自动化分析、系统资源巡检、数据清洗报表等核心运维场景,是普通运维进阶高级自动化运维的标志性技能。

最新文章

随机文章