簡體   English   中英

僅在給定模式匹配的情況下,使用sed或awk獲取范圍

[英]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.

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