2016-10-10 28 views
0

情況是下一個。我得到了日誌文件,其中記錄有負字符等分離:Bash:如何在圖案之間得到線條只有在它們之間有圖案2

Timestamp1 
--- 
Log: 1 
Address: http://addr1.com 
Payload: <soap:Envelope> 
      <soap:Body> 
       <context 1-1> 
       <context 1-2> 
       <context 1-3> 
      </soap:Body> 
     <soap:Envelope> 
---; 
Timestamp2 
--- 
Log: 2 
Address: http://addr2.com 
Payload: <soap:Envelope> 
      <soap:Body> 
       <context 2-1> 
      </soap:Body> 
     <soap:Envelope> 
---; 
Timestamp3 
--- 
Log: 3 
Address: http://addr3.com 
Payload: <soap:Envelope> 
      <soap:Body> 
       <context 3-1> 
       <context 3-2> 
      </soap:Body> 
     <soap:Envelope> 
---; 
... 

我需要得到整個日誌信息,其中一些關鍵詞如發現如果關鍵詞是「上下文2-1」下一個字符串應該打印:

--- 
Log: 2 
Address: http://addr2.com 
Payload: <soap:Envelope> 
      <soap:Body> 
       <context 2-1> 
      </soap:Body> 
     <soap:Envelope> 
---; 

所以,我怎麼能與它周圍的定界符的「貪婪」切這個模式搜索嗎?

+0

刪除'...'並顯示更好的示例並顯示您的嘗試。 – anubhava

回答

1

隨着SED:

sed -n '/^---/ {:a;N;/---;/!ba;/context 2-1/p}' file 

說明:

  • /^---/當開頭的行--- 發現
  • a:標籤來循環
  • N:添加下一個行到模式空間
  • /---;/!:雖然---;如果沒有找到...
  • ba循環來a標籤
  • /context 2-1/p:當循環結束,打印所有行之前添加到模式空間,如果context 2-1發現
0

以此爲指導:How to select lines between two patterns?

$0=="---" {     # at the fron marker 
    flag=1     # flag up 
    buf=""     # clear the buf 
} 
$0=="---;" { flag=0 }   # at the end marker, flag down 
{ 
    buf=buf $0 (flag?RS:"") # gather buffer, add RS before the end marker 
    if($0 ~ "^Payload2")  # if keyword found 
     output=1    # output flag up 
} 
flag==0 && output==1 {  # after end marker when putput flag up 
    print buf     # output buf 
    output=0     # output flag down 
} 

運行:

$ awk -f script.awk logfile 
--- 
Log2 
Address2 ... 
Payload2 ... 
---; 
+0

謝謝你的回答。是的,我知道如何使用sed在模式之間剪切文本,但我不知道如何檢查另一種模式的存在。 –

0
awk -vRS="Timestamp[0-9]+" -v k="context 2-1" '$0~k' file2 

它使用Timestamp[0-9]+作爲一個新行字符。 k是你想要的關鍵字。如果$0與關鍵字匹配,則打印$0

相關問題