在 bash 中出现第 n 次后打印几行

Mil*_*ils 4 grep awk perl text-processing

我正在寻找一种方法来搜索模式的第 n 次出现并在模式后打印 k 行。我想awk会比grep在这种情况下工作得更好,但我不知道如何正确地做到这一点......

假设我有以下文本文件:

Draft  
blablablabla  
tralalalalala  
Draft  
blablablabla  
tralalalalala  
Draft  
important line 1  
important line 2  
Draft   
blablablabla   
tralalalalala  
Run Code Online (Sandbox Code Playgroud)

在这种情况下n=3k=2,我想打印以下模式“草案”的3TH发生2行。在我的特定情况下,n 和 k 可能会有所不同。

这是一个简单的方法吗?

cho*_*oba 7

Perl 来拯救:

 perl -sne '$c++ if /Draft/;
            if ($c == $n) { print scalar <> for 1 .. $k; }
           ' -- -n=3 -k=2 < input
Run Code Online (Sandbox Code Playgroud)
  • -s解析开关-n=3并创建变量。
  • -n 逐行读取输入。
  • <> 菱形运算符从输入中读取。
  • 只需要从输入中读取一行就需要标量,否则print将强制使用菱形运算符的列表上下文并打印所有剩余的行。


gle*_*man 5

awk:打印第 3 行和第 4 行“草稿”之间的行。

awk -v n=3 '/Draft/ { p = (++num == n) ; next }; p' file
Run Code Online (Sandbox Code Playgroud)

有一个优化:当看到第四稿时退出。