繁体   English   中英

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

[英]How to print 5 consecutive lines after a pattern in file using awk

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

我需要使用awk才能做到这一点。

例:

文件内容:

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

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

在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

在GNU sed

sed -n '/PATTERN/,+7p' inputfile

要么

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

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

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

/PATTERN/ {
    lines = 5
}

' < input

这会产生:

#Line1
#Line2
#Line3
#Line4
#Line5

如果决定给grep一个机会, grep "PATTERN" search-file -A 5将为你完成这项工作。

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

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

编辑:没有注意到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}'

读取为趋于0. / qmaild /设置为5 :-)

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM