Answers:
AWK可以使用模式范围来做到这一点,这允许使用任何正则表达式:
echoer | awk '/pattern/,0'
echoer
从第一行匹配开始打印输出pattern
。
AWK基于模式,通常与“如果此模式匹配,请执行此操作”类型的方法一起使用。“此模式”可以是一系列模式,定义为“当此模式匹配时,开始执行此操作,直到该其他模式匹配”;如上所述,这可以通过编写两个用逗号分隔的模式来指定。模式可以是文本匹配,例如中的/pattern/
,其中根据模式检查当前行,将其解释为正则表达式;它们也可以是通用表达式,可以为每一行求值,并且如果它们的结果为非零或非空,则认为它们匹配。
在AWK中,默认操作是打印当前行。
将所有这些放在一起,awk '/pattern/,0'
查找匹配的行pattern
,找到一个匹配的行,对所有行应用默认操作,直到0
条件匹配(非零)。awk '/pattern/,""'
也会工作。
该Gawk的手动进入更多的细节。
0
怎么办?会/pattern/,/0/
吗?明确地写出默认操作的答案看起来像什么?
/pattern/,/0/
将打印直到找到包含“ 0”的行(记录)。用明确的动作在答案中写摘录给出/pattern/,0 { print $0 }
或等同地/pattern/,0 { print }
。
sed
@StephenKitt的强制性等效项awk
:
sed '/pattern/,$!d'
pattern
那里被解释为基本正则表达式像grep
(而不是扩展正则表达式中awk
/ egrep
/ grep -E
)。某些sed
实现具有-E
(BSD,ast,最近的GNU / busybox,即将推出POSIX)或-r
(GNU,ssed,busybox,一些近期的BSD)选项来使其成为扩展正则表达式,而-P
另一些具有(ast)或-R
(ssed)使其成为扩展正则表达式。类似perl的正则表达式。
与perl
:
perl -ne 'print if /pattern/ .. undef'
awk
用于第一个模式匹配之后(但不包括)的行如果包含触发模式的行与“ CUT HERE”等效,则可以从打印输出中将其忽略:
echoer | awk 'flag ; /pattern/ { flag=1 }'
输入的每一行都通过awk代码中的两个组件运行。第一个组件是flag
,awk将其解释为“如果变量flag
为非零,则打印行”。由于awk变量默认为0,因此最初不会打印任何内容。
第二个组件,/pattern/ { flag=1 }
一旦检测到模式,就将标志设置为1,并且该标志在其余的运行中保留该值。
到第一次检测到图案时,已经打印该行输入的机会已经过去。任何后续行(包括包含该模式的其他行)都将打印。