补充说明
gawk 是 GNU Awk,POSIX awk 的完整实现并带大量扩展,因此常作为 Linux 发行版上 awk 的默认实现(Debian/Ubuntu 的 awk 通常指向 gawk,RHEL 系则由 gawk 包提供 /usr/bin/awk)。
awk 按“记录—字段”模型工作:默认按行读入记录,按空白拆分成 $1、$2……$0 表示整行,NR 是当前记录号,NF 是字段数。程序由 BEGIN、若干 模式 {动作} 和 END 组成,非常适合做列提取、聚合统计和报表格式化。
gawk 的常用扩展包括 gensub()、asort()、strftime()、ENVIRON 数组、--posix 严格模式,以及用 -i inplace 直接原地修改文件。awk 脚本较大时建议写入 .awk 文件用 -f 加载,便于维护。
语法
gawk [选项] '程序' 文件...
gawk [选项] -f 脚本文件 文件...
选项
-F 分隔符:指定字段分隔符,等价于BEGIN{FS="…"};-F '\t'表示制表符-v 变量=值:在程序运行前赋值,可多次使用-f 文件:从文件读取 awk 程序-i inplace:加载 inplace 扩展,原地修改输入文件(备份后缀用-v INPLACE_SUFFIX=.bak)--posix:按 POSIX 标准运行,关闭 GNU 扩展-E 文件:类似-f,但禁止把后续参数当脚本解析-W 选项/--lint:兼容性选项与语法检查告警
实例
# 按冒号分割 /etc/passwd,打印用户名和登录 shell
gawk -F: '{print $1, $7}' /etc/passwd
# 统计文件行数(模拟 wc -l)
gawk 'END{print NR}' access.log
# 过滤并计算某列总和
gawk -F, '$3 > 100 {sum += $3} END{print sum}' sales.csv
# 用 BEGIN 设置输出格式,并打印表头
gawk 'BEGIN{FS=","; OFS="\t"; print "name", "size"} {print $1, $2}' data.csv
# 通过 -v 传入外部变量
gawk -v limit=500 '$2 > limit' data.txt
# 原地把 CRLF 转成 LF(先备份为 file.txt.bak)
gawk -i inplace -v INPLACE_SUFFIX=.bak '{sub(/\r$/, "")} 1' file.txt
# 使用 gensub 做正则替换(gawk 扩展)
gawk '{print gensub(/[0-9]+/, "N", "g")}' file.txt