[英]How to get only part of a line using grep/sed/awk with regex?
[英]get range out using sed or awk, only if given pattern match
輸入:
START
OS:: UNIX
Release: xxx
Version: xxx
END
Description about UNIX
<Multiline>
START
OS:: LINUX
Release: xxx
Version: xxx
END
Description about LINUX
<Multiline>
START
OS:: Windows
Release: xxx
Version: xxx
END
Description about Windows
<Multiline>
在這里,僅當我可以匹配OS Type時,我試圖獲取START和END之間的所有信息。
我可以獲得介於START和END之間的所有數據,但是我不知道如何匹配模式
使用SED
sed -n '/START/,/END/p'
使用AWK
awk '/START/,/END/'
預期產量
在搜索Linux時
START
OS:: LINUX
Release: xxx
Version: xxx
END
需要幫忙!!
提前致謝
$ awk 'last~/START/ && /LINUX/ {print last; f=1} f{print} /END/{f=0} {last=$0}' file
START
OS:: LINUX
Release: xxx
Version: xxx
END
即使輸入中的行位於START-END塊之外,此方法也將起作用。
last~/START/ && /LINUX/ {print last; f=1}
如果最后一行與START
匹配且當前行與LINUX
匹配,則打印最后一行並將變量f
設置為1。
f{print}
如果f
為非零,則打印當前行。
/END/{f=0}
如果當前行與END
匹配,則將f
設置為零。
last=$0
將當前行保存在變量last
。
$ awk 'BEGIN{RS=ORS="END\n"}/LINUX/' file
START
OS:: LINUX
Release: xxx
Version: xxx
END
它設置在輸入和輸出記錄分隔到END\\n
,所以基本上有一個START-END
每記錄塊(當然,在技術上START-
不END
,因為它是一個記錄分隔符),並且打印出具有塊LINUX
在它。 修改匹配的正則表達式部分( /LINUX/
)以適合您的需求。
您能否也請嘗試跟隨awk並讓我知道是否有幫助。
awk '/START/{count++} /OS.*LINUX/ && count{count++} /END/ && count==2{print val RS $0;val=count="";next}{val=val?val ORS $0:$0}/END/{count=val=""}' Input_file
也添加非單一襯里形式的解決方案。
awk '
/START/{
count++
}
/OS.*LINUX/ && count{
count++
}
/END/ && count==2{
print val RS $0;
val=count="";
next
}
{
val=val?val ORS $0:$0
}
/END/{
count=val=""
}
' Input_file
輸出如下。
START
OS:: LINUX
Release: xxx
Version: xxx
END
awk解決方案:
awk '/START/{pr=$0}/LINUX/{ print pr; n=NR+3 }NR<=n{print}' file
輸出:
START
OS:: LINUX
Release: xxx
Version: xxx
END
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.