awk对于第一个模式匹配之后(但不包括)的行

awk对于第一个模式匹配之后(但不包括)的行

有一个脚本(我们称之为echoer)可以打印屏幕上的一堆信息。我希望只能在找到模式后才能看到线条。

我想象解决方案的使用看起来像

echoer | solution_command <pattern>

理想情况下pattern是正则表达式,但硬值字符串对我来说就足够了。

答案1

AWK 可以使用模式范围来做到这一点,它允许使用任何正则表达式:

echoer | awk '/pattern/,0'

将从第一行匹配开始打印echoer输出pattern

AWK 是基于模式的,通常与“如果此模式匹配,则执行此操作”类型的方法一起使用。 “这个模式”可以是一系列模式,定义为“当这个模式匹配时,开始执行此操作,直到另一个模式匹配”;这是通过编写两个用逗号分隔的模式来指定的,如上所述。模式可以是文本匹配,如 中/pattern/,其中根据模式检查当前行,将其解释为正则表达式;它们也可以是通用表达式,对每一行进行计算,如果结果非零或非空,则视为匹配。

在 AWK 中,默认操作是打印当前行。

将所有这些放在一起,awk '/pattern/,0'查找匹配的行pattern,一旦找到,将对所有行应用默认操作,直到条件0匹配(非零)。awk '/pattern/,""'也会起作用的。

Gawk手册更详细的内容。

答案2

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'

答案3

使用 GNU 和 *BSD grep:

grep -A1000000000 pattern file

除非你的文件超过 1M 行,否则就这样了。

答案4

awk对于第一个模式匹配之后(但不包括)的行

如果包含触发模式的行相当于“CUT HERE”,则可以从打印输出中省略它:

echoer | awk 'flag ; /pattern/ { flag=1 }'

每行输入都经过 awk 代码中的两个组件。第一个组件是flag,awk 将其解释为“如果变量flag非零则打印该行”。由于 awk 变量默认为 0,因此最初不会打印任何内容。

第二个组件/pattern/ { flag=1 }检测到模式后立即将标志设置为 1,并且该标志在运行的其余部分中保持该值。

当第一次检测到该模式时,打印该输入行的机会已经过去了。将打印任何后续行(包括包含该图案的其他行)。

相关内容