如何使用 awk 命令在匹配正则表达式之前和之后打印 5 行

Posted

技术标签:

【中文标题】如何使用 awk 命令在匹配正则表达式之前和之后打印 5 行【英文标题】:How to print 5 lines before and after the match regex with awk command 【发布时间】:2020-07-17 09:35:42 【问题描述】:

我想使用 awk 打印匹配正则表达式之前的 5 行和之后的 5 行(以 ERROR 开始并以 INFO |WARN |DEBUG|TRACE 的 on 结束)。 另外,我还需要打印行号。 我刚刚成功打印了行号

cat  foo |  awk '/\[ERROR\]/,/\[(INFO |WARN |DEBUG|TRACE)/print NR":"$0'

我不在乎用 grep 命令找到解决方案

例如,文件包含:

DEBUG
DEBUG
DEBUG
TRACE
TRACE
INFO 
INFO 
ERROR
INFO 
INFO 
INFO 
DEBUG
DEBUG
DEBUG
DEBUG

输出应该是:

3: DEBUG
4: TRACE
5: TRACE
6: INFO 
7: INFO 
**8: ERROR
9: INFO** 
10: INFO 
11: INFO 
12: DEBUG
13: DEBUG
14: DEBUG

星号标记匹配正则表达式(以 ERROR 开始,以 INFO 结束)

【问题讨论】:

请在您的问题中添加示例输入(无描述、无图像、无链接)以及该示例输入所需的输出(无评论) grep -n -A5 -B5 ERROR file.txt grep -n -A5 -B5 ERROR file.txt | sed 's/:/: /;s/-/: /' 在开始模式之前/之后是否总是至少有 5 行(本例中为“错误”)?文件中可以有多个“错误”吗?如果有 2x 'ERROR' 模式并且它们之间的行数少于 10 行,你会期望输出什么? 【参考方案1】:
$ cat tst.awk
 buf[NR%6] = $0 
/ERROR/  tgt=NR; f=1 
tgt == NR 
    for (i=1; i<=6; i++) 
        print (NR+i-6) ":", buf[(NR+i)%6]
    

f && /INFO|WARN|DEBUG|TRACE/  tgt=NR+5; f=0 

.

$ awk -f tst.awk file
3: DEBUG
4: TRACE
5: TRACE
6: INFO
7: INFO
8: ERROR
9: INFO
10: INFO
11: INFO
12: DEBUG
13: DEBUG
14: DEBUG

【讨论】:

【参考方案2】:

试试grepsed

grep -n -A5 -B5 ERROR file.txt | sed 's/:/: /;s/-/: /'

【讨论】:

在这种情况下,grep 只打印带有 ERROR 的行,而不是 Begin(ERROR) 和 End(INFO/WARN/DEBUG/TRACE) 之间的所有行【参考方案3】:

我将这个 awk 提交给同行评审,把我的大脑变成了一碗意大利面条(甚至无法正确拼写 spaghetti):

$ awk '
    $0=NR " " $0                     # prepend NR to record

!f 
    b[6]=$0                          # buffer to hold 5 previous lines
    for(i=1;i<=5;i++) 
        if(/ERROR/)                  # print previous buffer at ERROR
            print b[i]
        b[i]=b[i+1]
    

/ERROR/,/(INFO|WARN|DEBUG|TRACE)/   # between markers arm the output flag
    f=5

f&&f--' file                         # keeps negative valued flags out

【讨论】:

一个范围表达式将永远是pasta-fy... :-) 梅尔吉布森的声音:I'm hungry, I'm going to get something to eat:|

以上是关于如何使用 awk 命令在匹配正则表达式之前和之后打印 5 行的主要内容,如果未能解决你的问题,请参考以下文章

Linux AWK学习

如何使用 awk 打印匹配的正则表达式模式?

awk从入门到入土正则匹配

Linux命令中使用正则表达式

十sed 命令与正则表达式

如何 grep/perl/awk 重叠正则表达式