Linux awk 七大高级实战命令(高频生产场景)
awk 三剑客核心文本处理工具,下面7条覆盖日志分析、统计、过滤、格式化、多文件、正则分组、字段运算等高级用法,每条附带场景、命令、详解。
1. 日志统计:按字段分组计数(最常用)
场景
统计Nginx/访问日志中每个IP的访问次数
awk '{print $1}' access.log | sort | uniq -c | sort -nr# awk纯实现(不用管道,性能更高)awk '{ip[$1]++} END{for(i in ip) print ip[i],i}' access.log
解析:
- •
ip[$1]++:关联数组,以IP为key累加访问次数
2. 多条件复合过滤 + 数值比较
场景
筛选服务器监控文件,CPU>80、内存>70的异常行
awk '$3>80 && $4>70 {print $1,"CPU:"$3,"MEM:"$4}' monitor.txt
进阶或/括号分组
awk '($3>90) || ($5 ~ /error|fail/) {print $0}' log.txt
3. 自定义分隔符(多分隔符、多字符分割)
场景
处理 key=val;name=test 分号+等号双分隔文本
# -F 指定分隔符,[]内写多个分割符号awk -F '[;=]' '{print $2,$4}' data.txt
- •
-F "xxx" 内置变量FS,也可在BEGIN中设置:
awk 'BEGIN{FS="[,| ]"} {print $1,$3}' file
4. BEGIN预处理 + 格式化输出(打印表头)
场景
输出带标题的结构化报表,统一对齐格式
awk 'BEGIN{ print "====用户资源统计====" printf "%-12s %8s %8s\n","用户名","CPU","内存"}$2>50{ printf "%-12s %8d %8d\n",$1,$3,$4}END{print "===================="}' server.txt
- •
BEGIN{}:读取文件前执行,适合初始化、打印表头 - •
printf 格式化输出,%-12s 左对齐占12字符
5. 正则分组提取内容(匹配捕获)
场景
从日志提取接口地址和响应耗时 GET /api/user cost=234ms
awk '/GET \/api\/.*cost=[0-9]+ms/ { match($0, /GET (\S+) cost=([0-9]+)ms/, arr); print "接口:"arr[1],"耗时:"arr[2]"ms"}' access.log
- •
match(行,正则,数组):捕获正则括号分组存入arr数组 - • arr[0]完整匹配内容,arr[1]第一个分组
6. 多文件联合处理(awk自动区分FILENAME)
场景
对比a.txt、b.txt,输出每个文件大于100的数值行,标记来源文件
awk '$1>100 {print FILENAME ":" NR ":" $0}' a.txt b.txt
内置变量:
取两个文件交集(常用对比需求):
awk 'NR==FNR{arr[$1]=1;next} arr[$1]' a.txt b.txt
7. 字段运算、求和、求平均值(数值统计)
场景
统计账单文件总金额、平均值、最大值
awk 'BEGIN{sum=0;max=0;count=0}$2 ~ /^[0-9]+$/ { sum+=$2; count++; if($2>max) max=$2;}END{ avg=sum/count; print "总和:"sum,"条数:"count,"均值:"avg,"最大值:"max}' bill.txt
支持浮点运算、三目运算符简化写法:
awk '{sum+=$NF} END{print "平均:"sum/NR}' num.txt
补充核心内置变量(配套7大命令必记)
- 2. OFS:输出分隔符,
BEGIN{OFS="|"}
高频拓展一条:替换文本(awk实现sed替换逻辑)
# 将第3列的error替换为successawk '{$3=sub(/error/,"success",$3)}1' log.txt
末尾 1 等价 {print $0},简写输出整行。