awk是Shell中能“看懂结构”的文本处理工具,自动按字段拆分每行并支持模式匹配、字段级操作、BEGIN/END流程控制及内置变量(如NF、NR)实现精准日志分析与报表生成。

awk 是 Shell 文本处理中真正能“看懂结构”的工具。它不靠整行匹配,而是把每行自动拆成字段,再按条件筛选、计算、重组——这正是日志分析、配置提取、报表生成等任务最需要的能力。
模式决定哪些行参与处理
模式写在动作前,不加花括号,可以是多种类型:
- 行号范围:
NR==5(只处理第 5 行),NR>=10 && NR(处理第 10 到 20 行) - 正则匹配:
/error/(含 error 的行),$1 ~ /^root$/(第一列精确等于 root) - 关系表达式:
$3 > 100(第三列数值大于 100),NF == 4(刚好 4 个字段的行) - 组合模式:
/^#/ || /^$/(跳过注释行和空行),NR%2==1(处理奇数行)
动作完成字段级精细操作
动作写在大括号内,常见用途包括提取、格式化、统计:
- 打印字段:
{print $1, $3}(输出第 1 和第 3 列,用空格分隔) - 自定义分隔符:
awk -F: '{print $1,$NF}' /etc/passwd(以冒号切分,输出用户名和 shell) - 字段拼接与计算:
{print $1 ": " $2*1.2}(第二列乘以 1.2 后拼接输出) - 条件分支:
{if ($4 > 80) print "high"; else print "normal"}
BEGIN 和 END 块控制全局流程
它们不属于任何具体行,只执行一次,适合初始化和收尾:
-
BEGIN {FS=","; OFS="\t"; print "User\tScore"}(设分隔符、表头) -
{sum += $2} END {print "Total:", sum}(累加第二列,最后输出总和) -
BEGIN{count=0} /success/{count++} END{print count}(统计含 success 的行数)
内置变量让逻辑更清晰可靠
不用手动计数或切分,awk 已经准备好关键信息:
-
NF:当前行字段数,print $(NF-1)取倒数第二列 -
NR:全局行号,FNR是当前文件内行号(多文件时有用) -
$0是整行,$1到$NF是各列,FILENAME是当前文件名 - 修改
FS可切换输入分隔符,比如FS="[:;]"支持多个分隔字符

















