awk 和 regex 与 {}

awk 和 regex 与 {}

如果记录包含单词和一些字符(可选),我想打印整个记录。脚本:

/mount[ein]{0,2}/{
print $0}

不幸的是,它不起作用。没有“{”和“}”,它就可以工作。我尝试在“{”之前使用“\”:

/mount[ein]\{0,2\}/{
    print $0}

其他示例。对于文件:

mountx
mounte
mountee
mounteee

awk:

awk '/mount[ein]{0,2}$/' file

结果:

//没有什么

系统:Debian 7.8 Linux ibm 3.2.0-4-amd64 #1 SMP Debian 3.2.68-1+deb7u1 x86_64 GNU/Linux

答案1

您的正则表达式既适用于 POSIX 兼容,awk也适用于 GNU awk

鉴于字符ein必须出现零到三次,但没有进一步的限制,因此可以从模式中删除此部分,因为mount后面跟着任何字符或什么都不匹配。动作 ( print $0) 也是默认动作,无需指定。

您的命令可以简化为:

awk '/mount/'

如果您想要使用该范围,则需要在其后指定一些内容,这里有一个示例:

$ cat input
foo
mountx
mounte
mountee
mounteee
$ /usr/xpg4/bin/awk '/mount[ein]{0,2}$/' input
mounte
mountee

那是在 Solaris 上,POSIX 就awk位于其中/usr/xpg4/bin

基于 Debian 的 Mint 17.1 上的行为相同:

$ awk -V | head -1      
GNU Awk 4.0.1
$ awk '/mount[ein]{1,2}$/' input     
mounte
mountee

然而,声称符合 POSIX 标准的 似乎mawk并不支持间隔(括号)表达式。

$ mawk -W version
mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan
$ mawk '/mount[ein]{1,2}$/' input
$ 

这是一个已知的漏洞

答案2

示例 tst.txt:

mountx
mounte
mountee
mounteee

awk(GNU Awk 3.1.7)脚本

awk --re-interval '/mount[ein]{0,2}$/' tst.txt > tst1.txt

结果

mounte
mountee

人 awk

-W re-interval
--re-interval
          Enable the use of interval expressions in regular expression matching (see Regular Expressions, below).  Interval expressions were not traditionally available in the AWK
          language.  The POSIX standard added them, to make awk and egrep consistent with each other.  However, their use is likely to break old AWK programs, so  gawk  only  pro-
          vides them if they are requested with this option, or when --posix is specified.

答案3

不确定您的 mount 命令格式,并且该问题被列为“awk”问题,但您的评论中没有 awk。

这就是你要找的东西吗?

“从文件中打印所有包含 0 的行”(或任何你要搜索的字符串) - 使用命令

cat temp.txt | grep 0 | awk '{print $0}'

将导致

0 9 8 7 6 5 4 3 2

5 4 3 2 1 0 9 8

其中 temp.txt 是

1 2 3 4 5 6 7

0 9 8 7 6 5 4 3 2

9 8 7 6 5 4

8 7 6 5 4 3

7 6 5 4 3

6 5 4 3

5 4 3 2 1 0 9 8

4

3

2

相关内容