仅使用awk在两个正则表达式之间打印

时间:2016-09-07 10:42:35

标签: bash awk

在弄清楚在两个字符串之间打印的方法时,我迷路了。这两个字符串都包含<,>之类的特殊字符。

我能够完美地使用sed实现这一点(但不能使用),但我需要awk,因为我需要对结果进行进一步的文本操作。

以下是示例文件:

$ cat input.txt
RANDOM CLI> THIS IS BEFORE WINDOW
RANDOM CLI>
RANDOM CLI>log list all show... 
bla bla
bla bla
bla bla bal
bla bla bla bla
RANDOM CLI>
RANDOM CLI>
RANDOM CLI>THIS IS OUT OF WINDOW

我对&#34; RANDOM CLI&gt;日志列表之间的文本感兴趣,所有显示...&#34; 和下一个&#34; RANDOM CLI&gt;&#34;

这可以使用sed来完成,如下所示:

$ sed -n '/CLI>log/,/ CLI>/p' cli
RANDOM CLI>log list all show...
bla bla
bla bla
bla bla bal
bla bla bla bla
RANDOM CLI>

但正如我所提到的,sed不适合我的要求,只需要一个awk解决方案。

有些尝试逃避特殊字符但没有帮助。

awk '/CLI>log/,/ CLI>/' input.txt
RANDOM CLI>log list all show...

awk '/CLI\>log/,/CLI\>/' input.txt 

awk '/CLI>log/{f=1;for (i=0;i<=NR;i++){getline}}/CLI>/{f=0}f' cli

1 个答案:

答案 0 :(得分:4)

基本的awk范围不起作用,因为在起始范围内找到了模式CLI>,因此导致awk仅在第一行后停止打印。

您可以锚定正则表达式以打印全范围:

awk '/ CLI>log/,/ CLI>$/' input.txt

RANDOM CLI>log list all show...
bla bla
bla bla
bla bla bal
bla bla bla bla
RANDOM CLI>

否则使用awk你也可以这样做:

awk 'p && / CLI>/{print; p=0} / CLI>log/{p=1} p' input.txt

此命令使用切换标志p来决定是否打印。当我们在一行中获得p时,1设置为CLI>log。我们会继续打印,直到我们在CLI>时获得下一个p==1文字。获得后,我们只需打印结束行并将p设置为0,以便我们停止打印。