[英]How to get text between two patterns in awk?
提供此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,因此任何提示,幫助或建議都將不勝感激。
空行很方便:您可以使用“段落”模式,其中每個awk記錄都由空行而不是換行符分隔:
awk -v RS="" '/^START HELLO/' file
如果將“ hello”作為參數傳遞:
awk -v RS="" -v start=HELLO '$1 == "START" && $2 == start' file
如果您需要在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
您的索引已關閉。 只需將您的awk更改為:
awk '/START/{l++} {if(l==3){exit;} if(l==2) {print}}' input.txt
要打印以“ 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並充分理解了適當的用法和所有注意事項。
我認為這可能會解決您的問題:
awk '/START HELLO/{print;while(getline)if($0 !~/START STACK/)print;else exit}' input.txt
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.