wiki/运维/操作系统/Linux/笔记/16.文本awk.md
2026-04-08 15:02:24 +08:00

2.8 KiB

1、awk 概览

awk 是 Linux 中非常强大的文本分析工具,特别适合处理按列分隔的数据。

常见用途:

  • 提取某几列字段
  • 按条件筛选内容
  • 统计求和
  • 格式化输出
  • 分析日志和表格类文本

2、工作流程

awk 的处理流程通常是:

  1. 先执行 BEGIN 语句块
  2. 逐行读取输入
  3. 对每一行执行 pattern { action }
  4. 最后执行 END 语句块

基本格式:

awk 'BEGIN{action} pattern{action} END{action}' file

3、字段分隔符

3.1 -F

用于指定输入字段分隔符。

awk -F: '{print $1}' /etc/passwd

这里的 : 表示按冒号分列。

3.2 内置变量 FS

FS 表示输入字段分隔符,功能类似 -F

awk 'BEGIN{FS=":"} {print $1}' /etc/passwd

4、常用变量

  • FS:输入字段分隔符
  • OFS:输出字段分隔符
  • NF:当前行字段数
  • NR:当前处理到第几行
  • $1$2:第 1 列、第 2 列
  • $0:整行内容

4.1 自定义变量

可以使用 -v 定义变量:

awk -v threshold=100 '$3 > threshold {print $0}' file.txt

5、常见动作

5.1 print

用于简单输出。

awk -F: '{print $1,$3}' /etc/passwd
  • 逗号表示按输出分隔符拼接
  • 字符串要用引号包裹

5.2 printf

用于格式化输出。

awk -F: '{printf "user=%s uid=%s\n", $1, $3}' /etc/passwd

常见格式符:

  • %s:字符串
  • %d:整数
  • %f:浮点数
  • %e:科学计数法
  • %c:字符
  • %u:无符号整数

注意:printf 不会自动换行,通常要手动加 \n

6、流程控制

awk 支持常见控制语句:

  • if
  • if ... else
  • while
  • for
  • break
  • continue
  • exit

6.1 条件筛选示例

awk -F: '$3 >= 1000 {print $1,$3}' /etc/passwd

表示打印 UID 大于等于 1000 的用户。

7、常见示例

7.1 提取第一列

awk '{print $1}' file.txt

7.2 打印行号和内容

awk '{print NR, $0}' file.txt

7.3 统计某列总和

awk '{sum += $1} END {print sum}' numbers.txt

7.4 格式化输出 /etc/passwd

awk -F: '{printf "user=%-15s uid=%s\n", $1, $3}' /etc/passwd

8、实战建议

  • 按列处理文本时优先考虑 awk
  • 做简单列提取时,cut 更轻;做条件判断和计算时,awk 更强
  • 处理日志、表格、监控数据时,awk 非常高频
  • 写复杂语句时,先从简单 print 版本调试,再逐步增强

9、小结

  • awk 是按行读、按列处理的强力文本工具
  • -FFSNRNF$1$0 是最常见概念
  • print 适合简单输出,printf 适合格式化输出
  • 它非常适合做日志分析、列提取和条件统计