gawk ( GNU AWK ) 是 AWK 文本处理工具的 GNU 实现版本,它在 awk 工具的基本功能(对结构化文本进行分析、内容提取和转换)的基础上增强了其文本处理和数据提取能力。它能够基于正则表达式处理文本流,并支持复杂字段操作和计算等。

本文将为你介绍 gawk 命令的使用方法,使你对 gawk 命令具有基本的了解,方便你使用该工具处理文本数据。

相关工具对比

特性 awk gawk nawk mawk
实现 基础标准 GNU 增强版本 新版的 AWK 简易的实现
性能 标准 高度优化 较好 最快
默认系统 到预装版本的链接 RHEL 系预装 FreeBSD 预装 Debian 系预装

gawk 命令语法结构

如下给出 gawk 命令的基本语法结构:

gawk [选项] '模式 { 动作 }' 文件...
gawk [选项] -f 脚本文件 文件...

语法结构中组成部分的解释:

  • 模式:行匹配条件(可以使用正则或表达式等)
  • 动作:模式匹配后执行的命令(用 {} 包裹,还可以另外包含” BEGIN{}:初始处理代码块,END{}:结束处理代码块“)
  • 文件:用来读取内容的文件(文件中字段默认的分隔符为空白字符[空格、Tab])

可以使用的其他符号:

  • RS:记录分隔符(默认 \n
  • FS:字段分隔符(默认空格)
  • OFS:输出字段分隔符

系统安装指南

gawk 是 GNU 版本的 awk,在没有预装 gawk 的系统中也包含 gawk 软件包。

Debian / Ubuntu 系统

在 Debian / Ubuntu 系统上使用如下命令安装 gawk 命令:

sudo apt update && sudo apt install gawk -y

RHEL / AlmaLinux 系统

在 RHEL / AlmaLinux / Rocky Linux 系统上已经预装了 gawk 命令。

FreeBSD 系统

在 FreeBSD 系统上使用如下命令安装 gawk 命令:

sudo pkg update
sudo pkg install gawk

gawk 命令使用示例

如下的示例中没有使用特定数据的话,就使用如下的 product.txt 文本中的数据:

2025-09-01,P001,12,99.9,0.95
2025-09-01,P002,8,159.5,0.9
2025-09-01,P003,23,49.9,1.0
2025-09-02,P001,15,99.9,0.95

字段对应的统一名称为:日期 产品ID 销量 单价 折扣率

1. 基本字段处理

该示例使用如下的数据:

2025-09-01 P001 12 99.9 0.95
2025-09-01 P002 8 159.5 0.9

如下动作中使用 print 输出特定的字段:

gawk '{print $2, $4*1.1}' product.txt

输出内容为:

P001 109.89
P002 175.45

文件字段的默认分隔符为空白符(空格、Tab)

如上的示例:没有没有给出模式,动作使用 print 输出第二个字段,把第四个字段的值乘1.1 后的值输出。

2. 自定义数据分隔符

使用 -F 指定分隔符,筛选内容(使用统一数据):

gawk -F, '{print $2, $4}' product.txt

输出内容为:

P001 109.89
P002 175.45
P003 54.89
P001 109.89

3. 使用条件筛选数据

使用模式,添加条件数据,过滤数据:

gawk -F, '$4 >= 100 {print $1, $2}' product.txt

如上示例只输出第四个字段的值大于等于 100 的行的第一个字段和第二个字段。

输出内容为:

2025-09-01 P002

4. 统计计算

可以使用 END{} 在执行一个动作后,执行收尾处理:

gawk -F, '{sum += $4} END {print "总计:" sum}' product.txt

如上的示例:第一个动作会把第四个字段的值求和,赋值为 sum,使用 END 输出 sum 数据。

如上示例输出的内容为:

总计:409.2

5. 正则匹配(~ 运算符)

针对特定字段后面使用 ~ 运算符,后面指定正则表达式,使用正则表达式筛选数据:

gawk -F, '$1~/[02]$/ {print $2}' product.txt

如上示例中的正则表达式匹配第一个字段结尾为 02 的行的第二个字段,输出内容为:

P001

6. 使用外部变量

使用 -v 定义一个外部变量,在动作代码块中使用:

gawk -v today="$(date +%F)" 'BEGIN {print "日期:", today}'

如上示例:定义了一个外部变量 today,在动作代码块中输出变量,输出内容为:

日期: 2025-09-04

命令选项详解

如下给出 gawk 命令选项的详细解释说明:

选项 说明 技术细节
-f file 从文件读取脚本 支持多个 -f 选项叠加使用
-F fs 指定字段的分隔符 支持正则表达式
-v var=val 定义外部变量 可在 BEGIN 前初始化
-d[file] 输出解析树 用于调试语法
-D[file] 启用交互调试模式 支持断点/单步
-e program 添加额外的代码 会在 -f 脚本前执行
-E file 设置主脚本文件 安全执行不受信任的脚本
-i includefile 加载库文件 支持 @include 指令
-l libname 加载扩展库 需先安装 gawk 扩展
-M 启用任意精度的算术 处理大整数/浮点
-n 禁用所有输出 仅通过退出码返回结果
-o[file] 格式化输出脚本内容 格式化复杂的脚本
-p[file] 用于性能分析 输出函数调用统计信息
-P POSIX 标准兼容模式 禁用 GNU 扩展
-r 使用正则表达式的区间 [a-z] 代替 [[:lower:]]
-s 沙箱运行模式 禁用 system() 等危险函数
-S 源代码级调试模式 需配合 -D 使用
-V 显示版本信息 包含功能支持列表
--dump-variables 输出全局变量 格式为 awk 脚本
--profile 用于能分析 -p
--traditional 启用传统模式 兼容旧版 awk
--help 显示帮助 包含所有选项

结语

本文全面的介绍了 gawk 的语法结构及其功能,并给出了 gawk 命令的具体使用示例,相信你能够对 gawk 命令有个基本的了解,并帮助你正确的使用 gawk 处理文本数据。 gawk 命令可以在 Linux 各发行版和 FreeBSD 系统中使用,基本功能是相同的。