我有一个日志文件,其中包含以下内容:
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<=x+3} LOG_FILE
但是,我似乎无法将 NR 输出放在 END 之后。
如何获取最后一场比赛后的以下 N 行?
感谢您的关注!
最佳答案
$ awk '/^Date:/ {c=1; a=$0;next} c<=3{c=c+1;a=a"\n"$0}END{print a}' LOG_FILE
Date: 2014-09-09
Price: 100
Amount: 2.6
ProcessedBy: Boss
一次获取一段代码:
/^Date:/ {c=1; a=$0;next}
每次以
Date:
开头的行遇到,分配计数器c
为 1,将该行分配给变量a
,然后跳到下一行c<=3{c=c+1;a=a"\n"$0}
如果计数器小于或等于 3,则增加计数器并将新行保存到变量
a
的末尾.END{print a}
打印
a
的最后出现的值.
此问题第二个版本的代码
$ awk -v RS= '/^Date:/ {a=$0} END{print a}' LOG_FILE
Date: 2014-09-09
Price: 100
Amount: 2.6
ProcessedBy: Boss
一次获取一段代码:
-v RS=
awk
将其输入分为“记录”。这可以通过设置记录分隔符RS
来实现。到一个空行。 (对于 GNUawk
,空RS
匹配空行。对于其他版本的awk
,您可能需要执行不同的操作。)/^Date:/ {a=$0}
每次遇到以
Date:
开头的记录时,它保存在变量a
中.END{print a}
运行结束时,最后看到的值
a
已打印。
此问题的第一个版本的代码
$ awk -v RS= 'END{print $0}' LOG_FILE
Date: 2014-09-09
Price: 100
Amount: 2.6
ProcessedBy: Boss
关于regex - awk 查找最后一个匹配项并打印接下来的 N 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25738205/