以下非常简洁的命令将打印模式第一次出现(包括第一次出现)之后的所有行:
awk '/pattern/,0'
有人可以解释这个命令是如何工作的吗?awk 如何解析'/pattern/,0'?
(顺便说一句,我没有想到这个;它发布在compgroups.net上。)
以下非常简洁的命令将打印模式第一次出现(包括第一次出现)之后的所有行:
awk '/pattern/,0'
有人可以解释这个命令是如何工作的吗?awk 如何解析'/pattern/,0'?
(顺便说一句,我没有想到这个;它发布在compgroups.net上。)
根据awk
手册页:
模式是正则表达式和关系表达式的任意布尔组合(带有!|| &&)。...
一个模式可能由两个用逗号分隔的模式组成;在这种情况下,对从第一个模式的出现到第二个模式的出现的所有行执行该操作。...
这里第一个是/pattern/
,第二个是字面常量0
,这是错误的。所以这从匹配的第一行开始,当一行根本不存在时停止,这仅在文件结束后发生。
作为另一个例子,比较:
jot 10
和:
jot 10 | awk 'NR==4,NR==6 { printf("line %d: %s\n", NR, $0) }'
因此awk '/foo/,/bar/{print $0}' file
将打印文件中从单词foo
until 开始的每一行bar
。
这种/foo/,/bar/
语法称为范围模式。如果第一个正则表达式常量/foo/
匹配,该块将被执行,直到第二个正则表达式常量/bar/
匹配。通过将第二个正则表达式常量设置为 0 (即 false),它将永远不会匹配,因此该块在每一行上执行,直到文件末尾。
如果awk
您没有block
为条件指定要执行的代码,则执行默认块{print $0}
。