regex - awk 查找最后一个匹配项并打印接下来的 N 行

标签 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 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 来实现。到一个空行。 (对于 GNU awk ,空 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/

相关文章:

PHP 和正则表达式 : Split a string by commas that are not inside brackets (and also nested brackets)

html - 使用命令行工具组合文件 (Linux/Mac)

bash - 计算在线 session 的总时间 - 跟进

linux - 如何在 Unix 中使用 grep 获取整个多行语句

javascript - 在两个单词之间应用正则表达式

regex - 在 awk 中的反斜杠 ("\") 分隔符上拆分字符串?

java - 将高等数学 'including root '字符串转为Java中ScriptEngine库代码执行

linux - 在 Ubuntu Bash Shell 上使用 read -d 选项

bash - 如何使用bash匹配不同目录下的文件名

linux - 用于监视磁盘 IO 的 shell 脚本无法正常工作