如何使用awk在文件中的模式后打印5个连续行

时间:2011-03-15 18:56:28

标签: shell unix awk

我想在文件中搜索一个模式,并在找到该模式后打印5行。

我需要使用awk才能执行此操作。

示例:

文件内容:

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

如何解析文件并仅打印上述行? 我是否使用包含“PATTERN”的行的NR并继续增加到5并在此过程中打印每一行。 如果在Awk中有任何其他有效的扫描仪,请告诉我。

7 个答案:

答案 0 :(得分:52)

在AWK中执行此操作的另一种方法:

awk '/PATTERN/ {for(i=1; i<=5; i++) {getline; print}}' inputfile
sed中的

sed -n '/PATTERN/{n;p;n;p;n;p;n;p;n;p}' inputfile

sed -n '1{x;s/.*/####/;x};/PATTERN/{:a;n;p;x;s/.//;ta;q}' inputfile

#个字符代表一个计数器。使用少于您想要输出的行数。

答案 1 :(得分:14)

awk '
{ 
    if (lines > 0) {
        print;
        --lines;
    }
}

/PATTERN/ {
    lines = 5
}

' < input

这会产生:

#Line1
#Line2
#Line3
#Line4
#Line5

答案 2 :(得分:12)

grep "PATTERN" search-file -A 5如果决定给予grep一个机会,你就会为你做这份工作。

编辑:您也可以使用system()脚本中的awk函数调用grep。

答案 3 :(得分:7)

编辑:没有注意到PATTERN不应该是输出的一部分。

cat /etc/passwd | awk '{if(a-->0){print;next}} /qmaild/{a=5}'

cat /etc/passwd | awk ' found && NR-6 < a{print} /qmaild/{a=NR;found=1}'

我能想到的最短的是:

cat /etc/passwd | awk 'a-->0;/qmaild/{a=5}'

读为 a趋向于0. / qmaild /将a设置为5 : - )

答案 4 :(得分:7)

awk救援!

使用图案线打印(共6行)

$ awk '/^####PATTERN/{c=6} c&&c--' file

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

跳过模式并打印下五行

$ awk 'c&&c--; /^####PATTERN/{c=5}' file

#Line1
#Line2
#Line3
#Line4
#Line5

答案 5 :(得分:0)

快速和肮脏的解决方案:awk '/PATTERN/ {i=0} { if (i<=5) {print $0}; i+=1} BEGIN {i=6}'

答案 6 :(得分:0)

受限于Johnsyweb的解决方案,但使用不同的方法和GNU awk的高级功能允许完整的RegEx记录分隔符,从而产生一段代码,恕我直言,非常awk - ish:< / p>

awk -F\\\n '{NF=5}NR-1' RS="PATTERN[^\n]*." OFS=\\\n

因此,如果你想要一个同样可读的稳定解决方案,那么请继续使用Dennis Williamson的答案(对于那个答案为+1),但也许你只是在看这样的行时享受awk的美丽。< / p>