一、什么是 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 条件与范围筛选

原始笔记中还整理了常见运算符:

运算符 含义
== 等于
!= 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于
&& 并且
||

匹配包含 rootnobody 的行:

$ 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 列以 01 开头的行:

$ 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

上面的结果就是 110 的总和:

55

七、小结

如果把 awk 的能力拆开看,本质上就四类:

  • 取行:NR==1NR>=2 && NR<=5
  • 取列:$1$3$NF
  • 条件过滤:$3>=100$4 ~ /^[01]/
  • 统计计算:END{print i}

把这四类操作练熟以后,处理大部分命令输出和配置文件分析任务都很高效。