awk 字符类之谜

awk 字符类之谜

我似乎无法使用字符类awk正则表达式,几乎与描述的完全一样这里

user@host:~$ awk -W version
mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan

compiled limits:
max NF             32767
sprintf buffer      2040
user@host:~$ echo "host.company.com has address 192.168.22.82" |awk '/^[a-zA-Z0-9.-]+ has address/ { print $4 }'
192.168.22.82
user@host:~$ echo "host.company.com has address 192.168.22.82" |awk '/^[[:alnum:].-]+ has address/ { print $4 }'
user@host:~$

有人知道为什么第二个命令找不到地址字段吗?

答案1

这是一个错误mawk 1.3.3并已报告这里。您可以升级mawk 1.3.4或使用补丁来修复该错误。

$ mawk -W version
mawk 1.3.4 20130219
Copyright 2013, Thomas E. Dickey
Copyright 1996, Michael D. Brennan

internal regex
compiled limits:
max NF             32767
sprintf buffer      2040

$ echo "host.company.com has address 192.168.22.82" | mawk '/^[[:alnum:].-]+ has address/ { print $4 }'
192.168.22.82

mawk与 with 一样使用扩展正则表达式egrep,因此它必须支持 POSIX 字符类。

答案2

您所指的文档是 GNU 版本的Awk,但您拥有的版本是莫克(如您的第一个命令所示)这是一个awk似乎不支持 POSIX 字符类(如[:alpha:]or )的变体[:alnum:]

编辑:作为Gnouc 提到的mawk从版本开始支持 POSIX 字符类1.3.4,因此更新可以解决您的问题。

答案3

关于 gawk 与 mawk POSIX 类,我不能代表其他类,但奇怪的是,只有 mawk 1.3.4 似乎在类方面是正确的 -

[[:graph:]]

我还没有测试更多过时/模糊的变体,但是 gawk 5.1 和 mawk2-beta 在这个特定的类中彼此对齐,都缺少一些韩语朝鲜文和中文汉字中的可打印字符。做类似的事情

/[[:graph:]]|[\352\353\354]/

大多确实有效,但 \355 中仍然有一些残差,没有任何可辨别的模式,允许编写干净的正则表达式来解释间隙。我只能祈祷 GNU 代码维护者能抽出时间来做这件事,但同时也认识到它在任何人的优先级列表上可能都处于极低的位置这一现实。

相关内容