在awk正则表达式中的花括号

7
我正在尝试使用花括号在 awk 中匹配固定数量的数字,但是我没有得到任何结果。
# This outputs nothing
echo "123" | awk '/^[0-9]{3}$/ {print $1;}' 

# This outputs 123
echo "123" | awk '/^[0-9]+$/ {print $1;}' 

我需要做一些特定的事情才能使用花括号吗?

2个回答

10

在 Mac OS X 中,awk(BSD awk)与第一个命令一起使用:

$ echo "123" | /usr/bin/awk '/^[0-9]{3}$/ {print $1;}' 
123
$

GNU awk 无法识别转义字符,即在正则表达式中使用反斜杠加特定字符的方式无法生效。但是可以通过使用选项--re-interval--posix来解决该问题。

$ echo "123" | /usr/gnu/bin/awk --re-interval '/^[0-9]{3}$/ {print $1;}' 
123
$ echo "123" | /usr/gnu/bin/awk --posix '/^[0-9]{3}$/ {print $1;}' 
123
$

我不确定 mawk 1.3.3(1996年)来自哪里,但是现在可能是时候为您的计算机获取更新版本的 awk 了。


1
谢谢,这在我的版本上不起作用,我得到了一个“awk:not an option: --re-interval”错误(awk -W version返回mawk 1.3.3 Nov 1996),这似乎是通用的答案。 - Mad Echet
哇,那是一个非常老的版本的 awk。也许现在是时候考虑升级到新版本了。 - Jonathan Leffler
当--re-interval不是一个选项时,那就不是gawk。当你需要--re-interval时,那是gawk的旧版本。无论哪种情况,都要获取最新的gawk。 - Ed Morton
它附带的是Ubuntu 12.04.2 LTS,不确定为什么他们没有包括更新版本。 - Mad Echet
3
mawk是一个功能较少的awk工具,为了提高执行速度进行了优化,因此无论您使用的是旧版还是新版,都应该会得到不同的awk处理结果。 - Ed Morton
我之前一直在使用 gawk 3.1.7 版本(发布于2009年)。现在我尝试升级到 gawk 4.0.2,但是遇到了 libraries/libtool 不按预期工作的问题。我会继续努力解决这个升级问题... - Jonathan Leffler

0

Ubuntu 20.04.4 LTS上,AWK是最新版本,发布于2020年,但它使用的是mawk

正如Ed Morton在评论中所述,"mawk是一个功能最小化的awk,优化了执行速度..."

看起来这些优化是以功能为代价的。

解决方案
安装GNU awk(gawk):

$ sudo apt install gawk -y

$ awk -W version
GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.2.0)
Copyright (C) 1989, 1991-2019 Free Software Foundation.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接