Regex 打印与第二个图案匹配的图案之间的所有线条

Regex 打印与第二个图案匹配的图案之间的所有线条,regex,bash,sed,awk,Regex,Bash,Sed,Awk,我有这样一个电子邮件日志文件: 2013-09-11 12:02:08 INFO: ------------------------------ 2013-09-11 12:02:08 INFO: Javamail session sending email 2013-09-11 12:02:08 INFO: Session properties: 2013-09-11 12:02:08 INFO: com.hof.email.starttime=20130911120208 2

我有这样一个电子邮件日志文件:

2013-09-11 12:02:08  INFO: ------------------------------
2013-09-11 12:02:08  INFO: Javamail session sending email
2013-09-11 12:02:08  INFO: Session properties: 
2013-09-11 12:02:08  INFO:    com.hof.email.starttime=20130911120208
2013-09-11 12:02:08  INFO:    mail.smtp.auth=true
2013-09-11 12:02:08  INFO:    mail.smtp.connectiontimeout=60000
2013-09-11 12:02:08  INFO:    mail.smtp.host=mailserver
2013-09-11 12:02:08  INFO:    mail.smtp.port=25
2013-09-11 12:02:08  INFO:    mail.smtp.timeout=60000
2013-09-11 12:02:08  INFO:    mail.transport.protocol=smtp
2013-09-11 12:02:08  INFO: From: Support
2013-09-11 12:02:08  INFO: To: Customer
2013-09-11 12:02:08  INFO: Subject: Your Report Data
2013-09-11 12:02:08  INFO: Message ID: <id>
2013-09-11 12:02:09  INFO: Email sent successfully
2013-09-11 12:02:09  INFO: Javamail session ended
2013-09-11 12:02:09  INFO: ------------------------------
2013-09-1112:02:08信息:------------------------------
2013-09-11 12:02:08信息:Javamail会话发送电子邮件
2013-09-11 12:02:08信息:会话属性:
2013-09-11 12:02:08信息:com.hof.email.starttime=2013091120208
2013-09-11 12:02:08信息:mail.smtp.auth=true
2013-09-11 12:02:08信息:mail.smtp.connectiontimeout=60000
2013-09-11 12:02:08信息:mail.smtp.host=mailserver
2013-09-11 12:02:08信息:mail.smtp.port=25
2013-09-11 12:02:08信息:mail.smtp.timeout=60000
2013-09-11 12:02:08信息:mail.transport.protocol=smtp
2013-09-11 12:02:08信息:发件人:支持
2013-09-11 12:02:08信息:收件人:客户
2013-09-11 12:02:08信息:主题:您的报告数据
2013-09-11 12:02:08信息:消息ID:
2013-09-11 12:02:09信息:电子邮件发送成功
2013-09-11 12:02:09信息:Javamail会话结束
2013-09-11 12:02:09信息:------------------------------
如果电子邮件主题与特定字符串匹配,我需要打印整个记录


也就是说,我想我要做的是,当
Subject='Your Report Data'
时,然后打印主题匹配中第n-1次出现的<代码>'--------------------------------------'和第1次出现的<代码>'----------------------------'之间的所有行。

如果行之间的部分始终相同,您可以将
grep
-A
-B
一起使用,这仅适用于
gawk

awk '/Subject: Your Report Data/{printf "%s%s\n",$0,RT}' RS="------------------------------" file
编辑:更复杂的版本,打印正确的部分

cat file
2013-09-11 12:02:08  INFO: ------------------------------
2013-09-11 12:02:08  INFO: Javamail session sending email
2013-09-11 12:02:08  INFO: Session properties:
2013-09-11 12:02:08  INFO:    com.hof.email.starttime=20130911120208
2013-09-11 12:02:08  INFO:    mail.smtp.auth=true
2013-09-11 12:02:08  INFO:    mail.smtp.connectiontimeout=60000
2013-09-11 12:02:08  INFO:    mail.smtp.host=mailserver
2013-09-11 12:02:08  INFO:    mail.smtp.port=25
2013-09-11 12:02:08  INFO:    mail.smtp.timeout=60000
2013-09-11 12:02:08  INFO:    mail.transport.protocol=smtp
2013-09-11 12:02:08  INFO: From: Support
2013-09-11 12:02:08  INFO: To: Customer
2013-09-11 12:02:08  INFO: Subject: Your Report Data
2013-09-11 12:02:08  INFO: Message ID: <id>
2013-09-11 12:02:09  INFO: Email sent successfully
2013-09-11 12:02:09  INFO: Javamail session ended
2013-09-11 12:02:09  INFO: ------------------------------
2013-09-11 12:02:08  INFO: Javamail session sending email
2013-09-11 12:02:08  INFO: Session properties:
2013-09-11 12:02:08  INFO:    com.hof.email.starttime=20130911120208
2013-09-11 12:02:08  INFO:    mail.smtp.auth=true
2013-09-11 12:02:08  INFO:    mail.smtp.connectiontimeout=60000
2013-09-11 12:02:08  INFO:    mail.smtp.host=mailserver
2013-09-11 12:02:08  INFO:    mail.smtp.port=25
2013-09-11 12:02:08  INFO:    mail.smtp.timeout=60000
2013-09-11 12:02:08  INFO:    mail.transport.protocol=smtp
2013-09-11 12:02:08  INFO: From: Support
2013-09-11 12:02:08  INFO: To: Customer
2013-09-11 12:02:08  INFO: Subject: Error
2013-09-11 12:02:08  INFO: Message ID: <id>
2013-09-11 12:02:09  INFO: Email sent successfully
2013-09-11 12:02:09  INFO: Javamail session ended
2013-09-11 12:02:09  INFO: ------------------------------

awk '/---/ {if (p) {for (j=0;j<i;j++) print a[j]};i=0;p=0;delete a;a[i++]=$0} !/---/ {a[i++]=$0} /Your/ {p=1}'
2013-09-11 12:02:08  INFO: ------------------------------
2013-09-11 12:02:08  INFO: Javamail session sending email
2013-09-11 12:02:08  INFO: Session properties:
2013-09-11 12:02:08  INFO:    com.hof.email.starttime=20130911120208
2013-09-11 12:02:08  INFO:    mail.smtp.auth=true
2013-09-11 12:02:08  INFO:    mail.smtp.connectiontimeout=60000
2013-09-11 12:02:08  INFO:    mail.smtp.host=mailserver
2013-09-11 12:02:08  INFO:    mail.smtp.port=25
2013-09-11 12:02:08  INFO:    mail.smtp.timeout=60000
2013-09-11 12:02:08  INFO:    mail.transport.protocol=smtp
2013-09-11 12:02:08  INFO: From: Support
2013-09-11 12:02:08  INFO: To: Customer
2013-09-11 12:02:08  INFO: Subject: Your Report Data
2013-09-11 12:02:08  INFO: Message ID: <id>
2013-09-11 12:02:09  INFO: Email sent successfully
2013-09-11 12:02:09  INFO: Javamail session ended
cat文件
2013-09-11 12:02:08信息:------------------------------
2013-09-11 12:02:08信息:Javamail会话发送电子邮件
2013-09-11 12:02:08信息:会话属性:
2013-09-11 12:02:08信息:com.hof.email.starttime=2013091120208
2013-09-11 12:02:08信息:mail.smtp.auth=true
2013-09-11 12:02:08信息:mail.smtp.connectiontimeout=60000
2013-09-11 12:02:08信息:mail.smtp.host=mailserver
2013-09-11 12:02:08信息:mail.smtp.port=25
2013-09-11 12:02:08信息:mail.smtp.timeout=60000
2013-09-11 12:02:08信息:mail.transport.protocol=smtp
2013-09-11 12:02:08信息:发件人:支持
2013-09-11 12:02:08信息:收件人:客户
2013-09-11 12:02:08信息:主题:您的报告数据
2013-09-11 12:02:08信息:消息ID:
2013-09-11 12:02:09信息:电子邮件发送成功
2013-09-11 12:02:09信息:Javamail会话结束
2013-09-11 12:02:09信息:------------------------------
2013-09-11 12:02:08信息:Javamail会话发送电子邮件
2013-09-11 12:02:08信息:会话属性:
2013-09-11 12:02:08信息:com.hof.email.starttime=2013091120208
2013-09-11 12:02:08信息:mail.smtp.auth=true
2013-09-11 12:02:08信息:mail.smtp.connectiontimeout=60000
2013-09-11 12:02:08信息:mail.smtp.host=mailserver
2013-09-11 12:02:08信息:mail.smtp.port=25
2013-09-11 12:02:08信息:mail.smtp.timeout=60000
2013-09-11 12:02:08信息:mail.transport.protocol=smtp
2013-09-11 12:02:08信息:发件人:支持
2013-09-11 12:02:08信息:收件人:客户
2013-09-11 12:02:08信息:主题:错误
2013-09-11 12:02:08信息:消息ID:
2013-09-11 12:02:09信息:电子邮件发送成功
2013-09-11 12:02:09信息:Javamail会话结束
2013-09-11 12:02:09信息:------------------------------

awk'/--/{if(p){for(j=0;j对于不同的行数,您也可以使用此Ruby代码:

ruby -e 'exp = Regexp.new("^[^\n]+INFO: -{30}$.*?INFO: Subject: #{Regexp.escape(ARGV.shift)}$.*?-{30}$", Regexp::MULTILINE); File.read(ARGV.shift).scan(exp).each{|e| puts e}' "Your Report Data" file

它不会将主题中的字符解释为regexp字符。

为了好玩,这里有一个GNU grep方法可以通过多行搜索来解决这个问题。关于如何在这个问题上工作的详细信息


grep-ozP'(?s)(?如果行与行之间的部分始终相同,您可以将
grep
-A
-B
一起使用。是否始终使用块的第12行?是的,每个条目的日志条目结构始终相同。如@mnagel所示,如果格式是固定的(
----
行与
主题:
行的距离总是相同的),那么“俗气”的方法是:
grep-a4-b12”信息:.*主题:log.txt
在这种情况下。谢谢你,@mnagel,这对我来说很有用。+1谢谢你的链接和这个答案。
-z
是一个应该记住的选项:)
grep -ozP '(?s)(?<=--\n).*?Subject: Your Report Data.*?(?=\n\N*?--)'