如何使用awk和匹配的行本身在文件中的模式后打印2个连续行

时间:2013-10-29 20:50:48

标签: regex awk

在如下的文本文件中,

####PATTERN#######
#Line1
#Line2
#Line3
#Line4
####PATTERN#######
#Line1
#Line2
#Line3
#Line4
#Line5
####PATTERN#######
#Line1
#Line2
#Line3
#Line4

我想提取匹配的行和接下来的2行。输出应该是:

####PATTERN#######
#Line1
#Line2
####PATTERN#######
#Line1
#Line2
####PATTERN#######
#Line1
#Line2

如何实现这一目标?

谢谢, 亚历

3 个答案:

答案 0 :(得分:2)

根据要求awk

awk '/PATTERN/{c=3}c&&c--' file

awk '/PATTERN/{c=3}c-->0' file

grep

更容易
grep -A2 file

答案 1 :(得分:1)

使用此awk:

awk '/PATTERN/{s=1} s++ < 4' file

####PATTERN#######
#Line1
#Line2
####PATTERN#######
#Line1
#Line2
####PATTERN#######
#Line1
#Line2

答案 2 :(得分:1)

使用grep有一种直接的方法。您将在上下文之间获得--行,并可以使用反向匹配-v删除它们。请参阅grep man page中的文档。

grep -A2 "PATTERN" file | grep -v -- "^--$"

使用awk:

awk '/PATTERN/{c=NR+2}(NR<=c){print}' file

使用sed:

sed '/PATTERN/,+2!d' file

Perl one-liner

perl -ne 'print if (/PATTERN/ and $p=2) .. not $p--' file