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
设置为空行来实现的。(对于GNUawk
,空的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