首页/系统/信创系统运维速查/awk 字段提取与统计
命令与包管理65 条

awk 字段提取与统计

按列处理文本:-F 指定分隔符,$1..$n 取列,NR/NF 做行号与列数控制,可以一行完成过滤加统计。

信创系统运维速查系统更新于 2026-10-13

awk 是干什么的

awk 按行读取文本并按分隔符切成字段,用 $1、$2 这样的写法引用列,再配合条件与累加完成过滤和统计。NR 表示当前行号,NF 表示当前行字段数,END 块在读完输入后执行。它适合现场做轻量的字段提取与求和统计,一条命令就能替代一段脚本。

基本信息

适用平台Linux 全发行版(常用实现为 gawk)
指定分隔符awk -F: 按冒号切分
引用字段$1 到 $n,$0 表示整行
内置变量NR 行号、NF 字段数、FS 分隔符
统计块END 块中输出累加结果

典型使用场景

  • 从配置文件按列提取账号或路径
  • 按条件筛选行,如筛选指定区间内的记录
  • 对某列做求和统计,快速核对资源占用
  • 统计日志中各状态码出现次数
  • 与 sort、uniq 组合做分组计数

典型用法

典型用法
awk -F: '{print $1, $3}' /etc/passwd | head       # 取前两列
awk -F: '$3>=1000 {print $1}' /etc/passwd          # 按条件筛选
ps aux | awk 'NR>1 {mem+=$4} END {print mem}'      # 累加内存占用百分比
ss -tn | awk '{print $1}' | sort | uniq -c         # 统计各状态连接数
awk 'NR>1 && NF>=5 {print $NF}' file.txt | head    # 取每行最后一个字段
awk '{print NR": "$0}' file.txt | head             # 给每行加行号

常用元素

写法含义示例
-F指定输入分隔符awk -F, 处理逗号分隔文件
$n第 n 个字段$1 是第一列
NR当前行号NR>1 跳过表头
NF当前行字段数$NF 取最后一个字段
END输入结束后的处理块输出累加结果
-v传入外部变量awk -v n=3 传入阈值

实践建议

  • 先确认文件真实分隔符再写 -F
  • 处理表头时用 NR>1 跳过首行
  • 统计结果配合 sort 与 uniq 更直观
  • 复杂逻辑改用脚本语言处理更可靠
  • 命令写进脚本时注意引号与转义
默认分隔符是空白字符,处理逗号分隔文件要显式指定;解析带引号的格式要评估引用内的分隔符,这类场景更适合用脚本语言处理。

易错点

  • 默认分隔符假设出错:处理逗号分隔文件不写 -F 会把整行当成一列,先用 head 确认格式
  • shell 引号写错:awk 程序要用单引号包裹,双引号会让美元符号被 shell 提前展开
  • 把 awk 用于复杂嵌套结构解析:容易写出难以维护的表达式,改用脚本语言更稳
  • 统计时把表头也算进去:用 NR>1 跳过首行,否则结果偏差且不易察觉
  • 数值与字符串比较混用:字段含非数字内容时比较结果可能不符合预期,先确认数据类型

数据来源与参考

  • GNU awk 手册(gawk)
  • 文本处理实践
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌