Linux 命令速查
文本处理 man gawk

gawk

GNU 版本的 awk 文本处理语言

返回

补充说明

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

参考链接