0

在如下文本文件中,

####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

如何做到这一点?

谢谢,亚历克斯

4

3 回答 3

2

使用 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 单行

perl -ne 'print if (/PATTERN/ and $p=2) .. not $p--' file
于 2013-10-29T22:38:56.533 回答
2

awk, 根据要求

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

或者

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

但它更容易grep

grep -A2 file
于 2013-10-29T20:56:06.420 回答
1

使用这个 awk:

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

####PATTERN#######
#Line1
#Line2
####PATTERN#######
#Line1
#Line2
####PATTERN#######
#Line1
#Line2
于 2013-10-29T20:55:58.830 回答