4

以下非常简洁的命令将打印模式第一次出现(包括第一次出现)之后的所有行:

awk '/pattern/,0'

有人可以解释这个命令是如何工作的吗?awk 如何解析'/pattern/,0'?

(顺便说一句,我没有想到这个;它发布在compgroups.net上。)

4

2 回答 2

5

根据awk手册页:

模式是正则表达式和关系表达式的任意布尔组合(带有!|| &&)。...

一个模式可能由两个用逗号分隔的模式组成;在这种情况下,对从第一个模式的出现到第二个模式的出现的所有行执行该操作。...

这里第一个是/pattern/,第二个是字面常量0,这是错误的。所以这从匹配的第一行开始,当一行根本不存在时停止,这仅在文件结束后发生。

作为另一个例子,比较:

jot 10

和:

jot 10 | awk 'NR==4,NR==6 { printf("line %d: %s\n", NR, $0) }'
于 2013-08-15T21:27:18.157 回答
4

因此awk '/foo/,/bar/{print $0}' file将打印文件中从单词foountil 开始的每一行bar

这种/foo/,/bar/语法称为范围模式。如果第一个正则表达式常量/foo/匹配,该块将被执行,直到第二个正则表达式常量/bar/匹配。通过将第二个正则表达式常量设置为 0 (即 false),它将永远不会匹配,因此该块在每一行上执行,直到文件末尾。

如果awk您没有block为条件指定要执行的代码,则执行默认块{print $0}

于 2013-08-15T21:28:48.587 回答