如何在awk中的两个模式之间获取文本?

时间:2014-05-25 23:52:50

标签: regex bash awk

给这个input.txt:

START asd
blah
blah
blah

START HELLO
lorem
ipsum
dolor 
sit
amet

START STACK
bleh
bleh

我正试图在START HELLOSTART STACK之间划清界线。

所以这是期望的输出

START HELLO
lorem
ipsum
dolor 
sit
amet

我做了这个awk:

awk '/START/{l++} {if(l==2){exit;} if(l==1) {print}}' input.txt

但是返回第一个START块,而不是START HELLO

START asd
blah
blah
blah

您是否有任何想法尽可能清楚地做到这一点?我几天前刚开始使用awk,所以任何提示,帮助或建议都会受到赞赏。

5 个答案:

答案 0 :(得分:4)

空白行很方便:您可以使用"段落"模式,其中每个awk记录由空行而不是换行符分隔:

awk -v RS="" '/^START HELLO/' file

如果"你好"将作为参数传递:

awk -v RS="" -v start=HELLO '$1 == "START" && $2 == start' file

答案 1 :(得分:2)

如果您需要在START HELLOSTART STACK之间指定,无论空格段落如何:

awk '/START HELLO/ {f=1} /START STACK/ {f=0} f;' file
START HELLO
lorem
ipsum
dolor
sit
amet

对于这个问题,这将是一个更准确的答案:(如果你需要多个部分,那就更好了)

I'm trying to get the lines between START HELLO and START STACK.   

我会正常寻求格伦的解决方案,但问题并非如此

awk -v RS="" '/^START HELLO/' file

答案 2 :(得分:0)

您的索引已关闭。只需将您的awk更改为:

awk '/START/{l++} {if(l==3){exit;} if(l==2) {print}}' input.txt

答案 3 :(得分:0)

打印以“START HELLO”开头的空行分隔块:

awk -v RS= '/^START HELLO/' file

要在“START HELLO”和以“START”开头的下一行之间打印文本:

awk '/^START HELLO{f=1} f{if (/^START/) exit; else print}' file

要在“START HELLO”和以“START STACK”开头的下一行之间打印文本:

awk '/^START HELLO{f=1} f{if (/^START STACK/) exit; else print}' file

如果您每个人都在考虑使用getline的解决方案,那么这可能是错误的方法,因此请务必先阅读http://awk.info/?tip/getline并在做出决定之前充分了解相应的用途和所有警告。

答案 4 :(得分:-1)

我认为这可能会解决您的问题:

awk '/START HELLO/{print;while(getline)if($0 !~/START STACK/)print;else exit}' input.txt