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

tom*_*h13 41 unix shell awk

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

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

例:

文件内容:

.
.
.
.
####PATTERN#######
#Line1
#Line2
#Line3
#Line4
#Line5
.
.
.
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*ce. 57

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

awk '/PATTERN/ {for(i=1; i<=5; i++) {getline; print}}' inputfile
Run Code Online (Sandbox Code Playgroud)

sed:

sed -n '/PATTERN/{n;p;n;p;n;p;n;p;n;p}' inputfile
Run Code Online (Sandbox Code Playgroud)

要么

sed -n '/PATTERN/,+7p' inputfile
Run Code Online (Sandbox Code Playgroud)

sed字符表示的计数器.使用少于您想要输出的行数.

  • 如果你打算使用sed(Gnu sed),那么sed -n`/PATTERN /,+ 5p'file`可能符合要求.或者`sed -n/PATTERN/{N; N; N; N; N; p}'文件`. (2认同)

Joh*_*web 14

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

/PATTERN/ {
    lines = 5
}

' < input
Run Code Online (Sandbox Code Playgroud)

这会产生:

#Line1
#Line2
#Line3
#Line4
#Line5
Run Code Online (Sandbox Code Playgroud)

  • 此代码存在问题.如果PATTERN在少于5行之后重复,则循环重新开始而不是完成所有5行的打印.丹尼斯的回答更好. (2认同)

anu*_*ava 12

grep "PATTERN" search-file -A 5 如果决定给grep一个机会,你会为你做的.

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

  • @Johnsyweb:`grep -A6 | 尾巴-5`? (4认同)

kar*_*kfa 8

awk 救援!

用图案线打印(共6行)

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

####PATTERN#######
#Line1
#Line2
#Line3
#Line4
#Line5
Run Code Online (Sandbox Code Playgroud)

跳过模式并打印下五行

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

#Line1
#Line2
#Line3
#Line4
#Line5
Run Code Online (Sandbox Code Playgroud)


nin*_*alj 7

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

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

要么

cat /etc/passwd | awk ' found && NR-6 < a{print} /qmaild/{a=NR;found=1}'
Run Code Online (Sandbox Code Playgroud)

我能想到的最短的是:

cat /etc/passwd | awk 'a-->0;/qmaild/{a=5}'
Run Code Online (Sandbox Code Playgroud)

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

  • 很好用[〜 - >`](http://stackoverflow.com/q/1642028/78845)运算符!但是你为什么要使用[`cat`](http://uuoc.com/)? (4认同)
  • 为了经验不足的读者的利益,肯定 - >是 - 运算符附加到'a'变量,>表示'大于',是吗?awk可以解析这种连接语法.太好了! (3认同)