awk处理文本列的核心是分隔符设定、字段引用和格式控制三步:用-F或BEGIN{FS}指定分隔符,用$1、$NF等引用列,用printf精确排版,并支持条件筛选与统计汇总。

awk 是处理复杂文本列最直接有效的工具,关键在于分隔符设定、字段引用和格式控制三步到位。它不依赖外部程序,单条命令就能完成提取+筛选+排版全流程。
识别并指定正确的字段分隔符
默认用空格或制表符切分,但真实数据常含逗号、冒号、竖线甚至多空格。必须显式声明分隔符,否则字段错位。
- 用 -F 参数指定:比如日志用竖线分隔,就写
awk -F '|' '{print $5}' access.log - 支持正则作分隔符:如字段间有多个空格或混合空白,可用
awk -F '[[:space:]]+' '{print $2}' data.txt - 在 BEGIN 块中设置更稳妥:特别是需要统一处理多个文件时,
awk 'BEGIN{FS=";"} {print $1,$4}' file1 file2
灵活引用目标列,包括动态位置
除了写死列号,还能用内置变量应对不规则结构,避免硬编码出错。
- $1 $2 $3 直接取固定列;$NF 总是最后一列,$(NF-1) 是倒数第二列
- 条件判断后再取值:比如只输出第3列大于100的行的第1和第4列,
awk '$3 > 100 {print $1, $4}' data.csv - 用正则匹配列内容:如提取邮箱域名部分,
awk -F '@' '{print $2}' users.txt
用 printf 精确控制输出格式
print 只能空格分隔,真正对齐、补零、保留小数或加前缀,得靠 printf。
- 基本格式:
printf "%-10s %6.2f\n", $1, $3—— 左对齐10字符宽的字符串,右对齐6字符宽、保留2位小数的浮点数 - 加单位或符号:如把字节数转为 KB 并标注,
awk '{printf "%s: %.1f KB\n", $1, $3/1024}' sizes.txt - 组合多字段成一行:
awk -F ',' '{printf "ID=%s, Name=%s, Score=%d\n", $1, $2, $3}' scores.csv
结合条件与统计做实用加工
不只是“取出来”,还能边取边算、边筛边汇总,适合报表生成。
- 筛选后计数:
awk '$6 == "ERROR" {cnt++} END {print "Errors:", cnt}' app.log - 按列求和:
awk '{sum += $4} END {print "Total:", sum}' sales.txt - 带标题的表格输出:
awk 'NR==1 {print "User\tUID\tShell"} NR>1 {print $1 "\t" $3 "\t" $7}' /etc/passwd

















