找到pattern1和pattern2之间出现的pattern3,并使用sed或awk返回pattern1和pattern2之间的所有行

时间:2015-12-02 06:28:40

标签: awk sed grep

=============文件从这里开始=============

模式1:

patterna

patternb

patternf

patternc

patternd

patterne

PATTERN2

模式1:

patterna

patternb

pattern_pat

patternc

patternd

patterne

PATTERN2

模式1:

patterna

patternb

patternf

patternc

patternd

patterne

PATTERN2

模式1:

patterna

patternb

pattern_pat

patternc

patternd

patterne

PATTERN2

模式1:

patterna

patternb

patternf

patternc

patternd

patterne

PATTERN2

=============文件在这里结束=============

现在我要搜索的模式是pattern_pat;我需要打印包含pattern_pat的pattern1和pattern2之间的所有行。喜欢以下

============= OutPut文件=============

模式1:

patterna

patternb

pattern_pat

patternc

patternd

patterne

PATTERN2

模式1:

patterna

patternb

pattern_pat

patternc

patternd

patterne

PATTERN2

我是awk和sed的新手。所以,任何有关这方面的帮助都会很棒

2 个答案:

答案 0 :(得分:1)

gawk的

awk -vRS='pattern1:' '/pattern_pat/&&/pattern2/{printf "%s %s",RT,$0}' file

SED

sed -n '/pattern1:/{:a;N;/pattern2/!ba;/pattern_pat/p}' file

答案 1 :(得分:0)

使用awk(可移植,应该可以使用任何POSIX awk):

$ awk ' f{s=s ORS $0}; /pattern1/{s=$0; f=1; g=0}; f && /pattern_pat/{g=1}; f && g && /pattern2/{print s; f=0}' file
pattern1:
patterna
patternb
pattern_pat
patternc
patternd
patterne
pattern2
pattern1:
patterna
patternb
pattern_pat
patternc
patternd
patterne
pattern2

此版本使用两个变量作为标志。当我们在pattern1 ... pattern2组中时,变量f为真(1)。如果我们在此组中看到g,则变量1为真(pattern_pat)。每当我们到达pattern2时,如果fg都为真,我们就会打印该组。