awk 正则匹配的方言特点
awk 的匹配运算符把左侧的字段或整行与右侧的模式做匹配判断,模式既可以是斜杠包裹的字面量,也可以是一个字符串变量。它的正则按扩展语法解释,但主流实现另外提供了若干扩展记号;更需要注意的是字符串与正则之间的两层解释:把模式写成字符串变量时,反斜杠要经过一次字符串转义。
基本信息
| 默认语法 | 扩展正则,分组、量词与交替直接书写 |
|---|---|
| 匹配运算符 | 匹配与不匹配两个运算符,可用于字段、整行与变量 |
| 字段分隔 | 单个字符按字面解释,多字符按正则解释,空白分隔有特殊处理 |
| 实现差异 | 主流实现提供词边界、字符类简写等扩展,与标准语法并不完全一致 |
典型使用场景
- 日志统计:按字段模式过滤后做计数与求和
- 配置提取:从多段配置里挑出关注项并打印指定字段
- 字段级校验:判断某列是否符合预期形状,例如状态码或版本号
- 条件分支:按匹配结果走不同处理逻辑,替代多层字符串比较
- 动态规则:模式由命令行变量传入,按运行时输入改变筛选条件
匹配写法与转义
匹配写法与转义
awk '$1 ~ /^[0-9]+$/ { print $2 }' data.txt # 字段级匹配:首列必须是数字
awk '!/^#/ && NF { print }' conf.txt # 条件组合:跳过注释行与空行
awk -F: '$3 > 1000 { print $1 }' /etc/passwd # 指定分隔符并按数值比较
awk -v re='^err' '$0 ~ re { print NR }' app.log # 动态模式:用变量传入
awk '$1 ~ "\\d+" { print }' data.txt # 字符串形式要写双反斜杠
awk -F'[,;]' '{ print NF }' data.txt # 多字符分隔符按正则解释
awk '{ n = split($0, a, /\s*,\s*/); print n }' data.txt # 切分时同样用正则常用写法与注意点
| 写法 | 含义 | 注意 |
|---|---|---|
| 字段匹配运算符 | 判断字段是否符合模式 | 模式写斜杠字面量时无需额外转义 |
| 模式作为整条记录出现 | 等价于判断整行 | 与显式整行匹配等价 |
| 动态模式变量 | 运行时决定模式内容 | 字符串层会先解释一次反斜杠 |
| 多字符分隔符 | 按正则解释 | 含特殊字符会改变切分结果 |
| 内建匹配函数 | 返回位置并设置两个内建变量 | 位置从 1 开始计数 |
主流实现提供的词边界、字符类简写等扩展记号在标准语法中不存在,写可移植脚本时应改用区间与显式字符类;同时注意大小写控制在标准语法里没有全局开关,需要结合大小写转换函数处理。
数值与字符串的比较规则由字段内容决定:形如数字的字符串会按数值比较,而带非数字字符的内容按字符串比较,比较前用显式转换能避免结果与预期不一致。