在弄清楚在两个字符串之间打印的方法时,我迷路了。这两个字符串都包含<,>
之类的特殊字符。
我能够完美地使用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
答案 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
,以便我们停止打印。