簡體   English   中英

如何在awk的兩個模式之間獲取文本?

[英]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 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,因此任何提示,幫助或建議都將不勝感激。

空行很方便:您可以使用“段落”模式,其中每個awk記錄都由空行而不是換行符分隔:

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

如果將“ hello”作為參數傳遞:

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

如果您需要在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

您的索引已關閉。 只需將您的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM