Linux系统之gawk详解

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等同于 -Fgawk --field-separator=,
--source=program从命令行读取程序文本gawk --source '{print $1}'

调试与性能

选项说明示例
--lint启用代码检查(fatal 选项可使警告致命)gawk --lint=fatal
--profile生成执行分析报告gawk --profile
--sandbox沙箱模式(禁用危险操作)gawk --sandbox

兼容性

选项说明示例
--posix强制 POSIX 兼容模式gawk --posix
--traditional传统模式(兼容旧版 awkgawk --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)指定域翻译字符串

示例用法

  1. 统计文件行数

    gawk 'END {print NR}' file.txt
    
  2. 按逗号分割字段并打印第一列

    gawk -F, '{print $1}' data.csv
    
  3. 替换字符串(全文件)

    gawk '{gsub(/old/, "new"); print}' file.txt
    
  4. 处理多文件并打印文件名

    gawk '{print FILENAME, $0}' file1.txt file2.txt
    
  5. 使用变量初始化

    gawk -v threshold=100 '{if ($1 > threshold) print}' data.txt
    
  6. 多维数组示例

    BEGIN {
        a["name", "age"] = 30
        print a["name", "age"]
    }
    
  7. 网络连接(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()、管道等危险操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值