2016-10-10 68 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

相关问题