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