找到一些文本后如何阅读某些行?

Col*_*old 12 shell bash

找到一些文本后如何阅读一定数量的行?

例如。:

在以下位置找到“Unix”后阅读接下来的 2 行:

Test 1
Test 2
Test 3
Test 4
UNIX
Test 5
Test 6
Test 7
Test 8
Test 9
Run Code Online (Sandbox Code Playgroud)

结果可以是:

Test 5
Test 6
Run Code Online (Sandbox Code Playgroud)

注意:最后一个例子中的“Unix”是一个参数,因此,它可以是任何其他文本。

我拥有的:

我仍然没有想法,只需要一盏灯。考虑创建另一个脚本来做到这一点。

cha*_*aos 13

一个grep解决方案:

grep -A2 -P '^UNIX$' file
Run Code Online (Sandbox Code Playgroud)

解释: -A意思是:在匹配后打印下两行

或者 awk:

awk '$0=="UNIX"{getline; print; getline; print}' file
Run Code Online (Sandbox Code Playgroud)

说明:在 ( $0=="UNIX")行中搜索 UNIX 。如果找到,将下一行放入缓冲区 ( getline) 并打印缓冲区 ( print)。这是做两次。

或使用sed

sed -n '/^UNIX$/{n;p;n;p}' file
Run Code Online (Sandbox Code Playgroud)

说明:搜索 UNIX ( /^UNIX$/)。如果找到,则执行{...}. n表示下一步,p表示打印。这也进行了两次。


cuo*_*glm 10

一个awk解决方案:

$ awk '$0 == "UNIX" {i=1;next};i && i++ <= 2' file
Test 5
Test 6
Run Code Online (Sandbox Code Playgroud)

解释

  • /^UNIX$/{i=1;next}:如果我们看到UNIX,我们设置变量i = 1,处理下一个输入。

  • 如果i设置了变量(意味着我们看到了UNIX),则i && i++ <= 2仅在 之后的接下来两行中评估为真值UNIX,从而导致awk执行默认操作print $0

  • 在看到之前UNIXi没有定义并从 3rd line 开始UNIXi有一个大于 2 的值,这使得 expressioni && i++ <= 2评估为 false,导致awk什么都不做。


小智 5

grep -A 2 UNIX file.txt
Run Code Online (Sandbox Code Playgroud)

grep 的联机帮助页这样描述了该选项:

  -A NUM, --after-context=NUM
      Print NUM  lines  of  trailing  context  after  matching  lines.
      Places  a  line  containing  --  between  contiguous  groups  of
      matches.
Run Code Online (Sandbox Code Playgroud)