给这个input.txt:
START asd
blah
blah
blah
START HELLO
lorem
ipsum
dolor
sit
amet
START STACK
bleh
bleh
我正试图在START HELLO
和START 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,所以任何提示,帮助或建议都会受到赞赏。
答案 0 :(得分:4)
空白行很方便:您可以使用"段落"模式,其中每个awk记录由空行而不是换行符分隔:
awk -v RS="" '/^START HELLO/' file
如果"你好"将作为参数传递:
awk -v RS="" -v start=HELLO '$1 == "START" && $2 == start' file
答案 1 :(得分:2)
如果您需要在START HELLO
和START 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