2013-10-29 14 views
0

在一個文本文件如下打印後連續2行,如何在文件中使用AWK的模式和匹配線本身

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

我想提取匹配的線和下兩行。輸出應該是:

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

如何做到這一點?

謝謝, 亞歷克斯

+0

你並不需要在awk這一點。比賽結束後使用'grep -A 2'打印2條線。 – Barmar

+0

參見http://awk.info/?OneLiners –

+0

可能的重複:http://stackoverflow.com/questions/17283567/print-specific-number-of-lines-after-matching-pattern –

回答

2

隨着awk,按要求

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

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

卜t更容易grep

grep -A2 file 
1

使用此AWK:

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

####PATTERN####### 
#Line1 
#Line2 
####PATTERN####### 
#Line1 
#Line2 
####PATTERN####### 
#Line1 
#Line2 
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的一個班輪

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

要擺脫羣組分隔符,你也可以使用'grep --no-group-separator -A2 ...' – fedorqui