我想在文件中搜索一个模式,并在找到该模式后打印5行。
我需要使用awk
才能执行此操作。
示例:
文件内容:
.
.
.
.
####PATTERN#######
#Line1
#Line2
#Line3
#Line4
#Line5
.
.
.
如何解析文件并仅打印上述行? 我是否使用包含“PATTERN”的行的NR并继续增加到5并在此过程中打印每一行。 如果在Awk中有任何其他有效的扫描仪,请告诉我。
答案 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>