gawk
是 GNU 版本的 AWK 程序,符合 POSIX 标准,并扩展了大量功能。它通过模式(pattern)和动作(action)处理文本,支持变量、数组、函数和复杂的数据操作。
语法
gawk [POSIX/GNU选项] -f 程序文件 [其他选项] 文件...
gawk [POSIX/GNU选项] [程序文本] 文件...
pgawk/dgawk [选项] 文件...
关键特性
- 模式与动作:通过
pattern { action }
结构处理输入记录。 - 内置变量:如
FS
(字段分隔符)、RS
(记录分隔符)、NR
(记录数)等。 - 扩展功能:支持多维数组、协程、TCP/IP 网络、国际化等。
- 兼容模式:
--traditional
保持与原始 awk
兼容。
选项
基础选项
选项 | 说明 | 示例 |
---|
-f file | 从文件读取 AWK 程序 | gawk -f script.awk data.txt |
-v var=value | 定义变量的初始值 | gawk -v FS="," -f script.awk |
-h /--help | 显示帮助信息 | gawk --help |
-V /--version | 显示版本信息 | gawk --version |
输入输出控制
选项 | 说明 | 示例 |
---|
-F fs | 设置字段分隔符 | gawk -F: '{print $1}' /etc/passwd |
--field-separator=fs | 等同于 -F | gawk --field-separator=, |
--source=program | 从命令行读取程序文本 | gawk --source '{print $1}' |
调试与性能
选项 | 说明 | 示例 |
---|
--lint | 启用代码检查(fatal 选项可使警告致命) | gawk --lint=fatal |
--profile | 生成执行分析报告 | gawk --profile |
--sandbox | 沙箱模式(禁用危险操作) | gawk --sandbox |
兼容性
选项 | 说明 | 示例 |
---|
--posix | 强制 POSIX 兼容模式 | gawk --posix |
--traditional | 传统模式(兼容旧版 awk ) | gawk --traditional |
其他
选项 | 说明 | 示例 |
---|
--exec file | 安全执行脚本(避免命令行注入) | gawk --exec script.awk |
--re-interval | 启用正则表达式区间匹配 | gawk --re-interval |
内置变量
变量 | 说明 |
---|
FS | 字段分隔符(默认空格) |
RS | 记录分隔符(默认换行符) |
OFS | 输出字段分隔符(默认空格) |
ORS | 输出记录分隔符(默认换行符) |
NF | 当前记录的字段数 |
NR | 已处理的总记录数 |
FNR | 当前文件的记录数 |
FILENAME | 当前处理的文件名 |
ENVIRON | 环境变量数组 |
PROCINFO | 进程相关信息(如 PID、系统时间) |
内置函数
字符串函数
函数 | 说明 |
---|
length(str) | 返回字符串长度 |
split(str, arr, sep) | 按分隔符分割字符串到数组 |
substr(str, start, len) | 截取子字符串 |
gsub(regexp, repl, str) | 替换所有匹配 |
sprintf(fmt, ...) | 格式化输出 |
数值函数
函数 | 说明 |
---|
rand() | 生成随机数 |
srand(seed) | 设置随机种子 |
int(expr) | 取整数部分 |
sqrt(expr) | 平方根 |
时间函数
函数 | 说明 |
---|
systime() | 返回当前时间戳(秒) |
mktime(str) | 将日期字符串转为时间戳 |
strftime(fmt, ts) | 格式化时间戳 |
数组与排序
函数 | 说明 |
---|
asort(arr) | 数组排序(按值) |
asorti(arr) | 数组排序(按索引) |
patsplit(str, arr, re) | 按正则表达式分割字符串 |
国际化
函数 | 说明 |
---|
gettext(str) | 翻译字符串 |
dcgettext(str, domain) | 指定域翻译字符串 |
示例用法
-
统计文件行数:
gawk 'END {print NR}' file.txt
-
按逗号分割字段并打印第一列:
gawk -F, '{print $1}' data.csv
-
替换字符串(全文件):
gawk '{gsub(/old/, "new"); print}' file.txt
-
处理多文件并打印文件名:
gawk '{print FILENAME, $0}' file1.txt file2.txt
-
使用变量初始化:
gawk -v threshold=100 '{if ($1 > threshold) print}' data.txt
-
多维数组示例:
BEGIN {
a["name", "age"] = 30
print a["name", "age"]
}
-
网络连接(TCP):
gawk 'BEGIN {print |& "/inet/tcp/0/www.example.com/80"; close("/inet/tcp/0/www.example.com/80")}'
注意事项
- 字段分隔符:
FS
为单字符时,默认忽略空格/制表符的连续输入。 - 记录分隔符:
RS
设为 ""
时,空行分隔记录。 - 兼容模式:
--posix
禁用 GNU 扩展功能(如 FIELDWIDTHS
)。 - 沙箱模式:
--sandbox
禁用 system()
、管道等危险操作。