一、什么是 awk¶
awk 是 Linux 中非常强大的文本处理工具,特别适合处理结构化文本,例如:
/etc/passwd这类分隔符明确的配置文件- 命令输出结果
- 监控、日志、统计类文本
它最常见的用途包括:
- 取行
- 取列
- 条件过滤
- 格式化输出
- 统计与计算
二、awk 的基本格式¶
2.1 基本结构¶
awk [选项] '条件动作' 文件
2.2 常见概念¶
NR:当前处理到第几行$1、$2、$NF:第 1 列、第 2 列、最后一列-F:指定分隔符$0:当前整行内容
例如,用冒号做分隔符,从 /etc/passwd 里取出第 1 列、第 3 列和最后一列:
$ awk -F: '{print $1,$3,$NF}' /etc/passwd
三、取行操作¶
3.1 取指定行¶
取第 1 行:
$ awk 'NR==1{print $0}' /etc/passwd
$ awk 'NR==1' /etc/passwd
取第 2 行到第 5 行:
$ awk 'NR>=2 && NR<=5' /etc/passwd
3.2 条件与范围筛选¶
原始笔记中还整理了常见运算符:
| 运算符 | 含义 |
|---|---|
== |
等于 |
!= |
不等于 |
> |
大于 |
>= |
大于等于 |
< |
小于 |
<= |
小于等于 |
&& |
并且 |
|| |
或 |
匹配包含 root 或 nobody 的行:
$ awk '/root|nobody/' /etc/passwd
从包含 root 的行一直取到包含 nobody 的行:
$ awk '/root/,/nobody/' /etc/passwd
四、取列操作¶
4.1 提取文件大小和文件名¶
$ ls -lh /etc/hosts | awk '{print $5,$NF}'
如果想让输出更整齐,可以配合 column -t:
$ ls -lh /etc/hosts | awk '{print $5,$NF}' | column -t
4.2 从 /etc/passwd 提取字段¶
$ awk -F ':' '{print $1,$3,$NF}' /etc/passwd | column -t
4.3 处理复杂分隔符¶
提取网卡 IP:
$ ip a s ens33 | awk -F '[ /]+' 'NR==3{print $3}'
提取 stat /etc/hosts 中的权限位:
$ stat /etc/hosts | awk -F '[^0-9]+' 'NR==4{print $2}'
五、条件筛选与正则匹配¶
5.1 数值条件判断¶
取出 /etc/passwd 中 UID 大于等于 100 的行,并输出用户名、UID 和最后一列:
$ awk -F ':' '$3>=100{print $1,$3,$NF}' /etc/passwd | column -t
5.2 正则条件判断¶
筛选出第 4 列以 0 或 1 开头的行:
$ awk -F ':' '$4 ~ /^[01]/ {print $1,$3,$4}' /etc/passwd | column -t
5.3 业务判断示例¶
如果系统 Swap 使用量大于 0,则输出告警提示:
$ free | awk '/Swap/ && $3 > 0 {print "异常,系统开始占用swap"}'
六、统计与计算¶
6.1 统计行数¶
统计 /etc/passwd 行数:
$ awk '{i++} END{print i}' /etc/passwd
6.2 求和¶
$ seq 10 > num.txt
$ awk '{i=i+$1} END{print i}' num.txt
上面的结果就是 1 到 10 的总和:
55
七、小结¶
如果把 awk 的能力拆开看,本质上就四类:
- 取行:
NR==1、NR>=2 && NR<=5 - 取列:
$1、$3、$NF - 条件过滤:
$3>=100、$4 ~ /^[01]/ - 统计计算:
END{print i}
把这四类操作练熟以后,处理大部分命令输出和配置文件分析任务都很高效。