Regex awk找到最后一个匹配项并打印接下来的N行

Regex awk找到最后一个匹配项并打印接下来的N行,regex,bash,awk,Regex,Bash,Awk,我有一个日志文件,其中包含以下内容: Date: 2014-09-07 Price: 1.35 Amount: 20 ProcessedBy: Bill Some other contents Date: 2014-09-08 Price: 10.1 Amount: 15 ProcessedBy: Alice Some other contents Date: 2014-09-09 Price: 100 Amount: 2.6 ProcessedBy: Boss Some other

我有一个日志文件,其中包含以下内容:

Date: 2014-09-07
Price: 1.35
Amount: 20
ProcessedBy: Bill

Some other contents

Date: 2014-09-08
Price: 10.1
Amount: 15
ProcessedBy: Alice

Some other contents

Date: 2014-09-09
Price: 100
Amount: 2.6
ProcessedBy: Boss

Some other contents
我想使用awk查找最后一个“日期”,并打印以下三行

Date: 2014-09-09
Price: 100
Amount: 2.6
ProcessedBy: Boss
我使用代码:


awk'/Date/{x=NR};END{NR>=x&&NR您也可以尝试perl

$ perl -0777pe 's/.*?\n(Date:(?:(?!Date:).)*)$/\1/s' file
Date: 2014-09-09
Price: 100
Amount: 2.6
ProcessedBy: Boss
一次编写一段代码:

  • -vrs=

    awk
    将其输入分为“记录”。这是通过将记录分隔符
    RS
    设置为空行来实现的。(对于GNU
    awk
    ,空的
    RS
    匹配空行。对于其他版本的
    awk
    ,您可能需要执行不同的操作。)

  • /^Date:/{a=$0}

    每次遇到以
    Date:
    开头的记录时,它都会保存在变量
    a

  • END{print a}

    运行结束时,将打印上次看到的
    a

此问题的第一个版本的代码
您可以尝试在两个图案之间打印线条,如下所示

awk '/StartPattern/,/EndPattern/' FileName 
对你来说,它可以像这样工作

awk '/2014-09-09/,/ProcessedBy/' FileName
您可以使用此awk:

awk -v RS= '/^Date:/{data=$0} END{print data}' file
Date: 2014-09-09
Price: 100
Amount: 2.6
ProcessedBy: Boss

您不能将
NR
放入
END
,但您可以这样做:

awk '{a[NR]=$0} /^Date/ {f=NR} END {for (i=f;i<f+4;i++) print a[i]}'
Date: 2014-09-09
Price: 100
Amount: 2.6
ProcessedBy: Boss

awk'{a[NR]=$0}/^Date/{f=NR}END{for(i=f;我感谢您的详细解释!使用RS=是一个不错的选择,但实际上我的日志文件包含一些与当前数据提取不相关的其他内容(抱歉,以前我没有清楚地描述)。我想查找“Date”的最后一次出现,然后打印下三行。但我以前查找最后一个“日期”并使用“结束”打印的方式不起作用。您能建议我如何实现这一点吗?非常感谢您的详细解释和多个答案!感谢您的回答。有时我不知道模式是什么(例如,日志中记录的日期),因此我必须找到最后一个事件:)
awk '/2014-09-09/,/ProcessedBy/' FileName
awk -v RS= '/^Date:/{data=$0} END{print data}' file
Date: 2014-09-09
Price: 100
Amount: 2.6
ProcessedBy: Boss
awk '{a[NR]=$0} /^Date/ {f=NR} END {for (i=f;i<f+4;i++) print a[i]}'
Date: 2014-09-09
Price: 100
Amount: 2.6
ProcessedBy: Boss