当前位置:首页>Linux>3分钟学会Linux命令行 awk 的七大高级实战命令

3分钟学会Linux命令行 awk 的七大高级实战命令

  • 2026-10-11 06:28:25
3分钟学会Linux命令行 awk 的七大高级实战命令

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累加访问次数
  • • END{}:文件全部读取完成后执行收尾逻辑
  • • 输出格式:次数 IP

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
  • • && 且、|| 或;~ 正则匹配字段内容
  • • $0 代表整行文本

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

内置变量:

  • • FILENAME:当前正在读取的文件名
  • • NR:全局行号(所有文件累计)
  • • FNR:单个文件内部行号(多文件必用)

取两个文件交集(常用对比需求):

awk 'NR==FNR{arr[$1]=1;next} arr[$1]' a.txt b.txt
  • • next:跳过当前行剩余逻辑,读取下一行

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
  • • $NF:当前行最后一个字段

补充核心内置变量(配套7大命令必记)

  1. 1. FS:输入分隔符,等价 -F
  2. 2. OFS:输出分隔符,BEGIN{OFS="|"}
  3. 3. NR / FNR:全局行号 / 单文件行号
  4. 4. FILENAME:当前文件名
  5. 5. NF:当前行总字段数,$NF 最后一列
  6. 6. RS:行分隔符(默认换行)
  7. 7. ORS:输出行分隔符

高频拓展一条:替换文本(awk实现sed替换逻辑)

# 将第3列的error替换为successawk '{$3=sub(/error/,"success",$3)}1' log.txt

末尾 1 等价 {print $0},简写输出整行。

最新文章

随机文章