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 更直观
- 复杂逻辑改用脚本语言处理更可靠
- 命令写进脚本时注意引号与转义
默认分隔符是空白字符,处理逗号分隔文件要显式指定;解析带引号的格式要评估引用内的分隔符,这类场景更适合用脚本语言处理。