如何使用 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】:试试grep
和sed
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 行的主要内容,如果未能解决你的问题,请参考以下文章