有一个脚本(我们称之为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,并且该标志在运行的其余部分中保持该值。
当第一次检测到该模式时,打印该输入行的机会已经过去了。将打印任何后续行(包括包含该图案的其他行)。