这个awk命令是如何工作的?

4
下面这个非常简洁的命令,将打印出第一次匹配(包括第一次匹配)之后的所有行:
awk '/pattern/,0'

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

(顺便说一句,这不是我想出来的,是在compgroups.net上发布的。)

2个回答

5
根据 awk 手册:
模式是正则表达式和关系表达式的任意布尔组合(使用 ! || &&)。…
一个模式可以由用逗号分隔的两个模式组成;在这种情况下,对于从第一个模式出现到第二个模式出现之间的所有行执行操作。...
这里的第一个模式是 /pattern/,第二个模式是字面常量0,表示假。因此,它从匹配的第一行开始,并在不存在行时停止,这只在文件结束后发生。
作为另一个例子,请比较:
jot 10

使用:

jot 10 | awk 'NR==4,NR==6 { printf("line %d: %s\n", NR, $0) }'

2
不:/pattern/是单地址形式,因此它只匹配与模式匹配的行。双地址形式在第一次匹配时触发,并在第二次匹配时关闭。 - torek
现在已经晚了,之前的评论措辞应该是“第二次匹配后”(例如试试上面的 jot)。 - torek

4
所以awk '/foo/,/bar/{print $0}' file会打印文件中从单词foobar的每一行。
这个/foo/,/bar/语法被称为范围模式。如果匹配第一个正则表达式常数/foo/,则该块将执行,直到匹配第二个正则表达式常数/bar/。通过将第二个正则表达式常量设置为0 (即false),它永远不会被匹配,因此该块在每一行上执行,直到文件结尾。
awk中,如果您没有为条件指定要执行的block代码,则执行默认块{print $0}

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