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

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

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

例如。:

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

Test 1
Test 2
Test 3
Test 4
UNIX
Test 5
Test 6
Test 7
Test 8
Test 9

结果可以是:

Test 5
Test 6

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

我拥有的:

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

答案1

一个grep办法:

grep -A2 -P '^UNIX$' file

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

或者awk:

awk '$0=="UNIX"{getline; print; getline; print}' file

解释:在 ( ) 行中搜索 UNIX $0=="UNIX"。如果找到,则将下一行放入缓冲区 ( getline) 并打印缓冲区 ( print)。这要进行两次。

或者使用sed

sed -n '/^UNIX$/{n;p;n;p}' file

解释:搜索 UNIX ( /^UNIX$/)。如果找到,则执行{...}.n意思是下一个,p意思是打印。这也完成两次。

答案2

解决方案awk

$ awk '$0 == "UNIX" {i=1;next};i && i++ <= 2' file
Test 5
Test 6

解释

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

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

  • 在看到 之前UNIXi没有定义,并且从 后的第 3 行开始UNIXi其值大于 2,这使得表达式i && i++ <= 2评估为 false,导致awk不执行任何操作。

答案3

grep -A 2 UNIX file.txt

grep 的手册页这样描述该选项:

  -A NUM, --after-context=NUM
      Print NUM  lines  of  trailing  context  after  matching  lines.
      Places  a  line  containing  --  between  contiguous  groups  of
      matches.

答案4

您可以使用ex

ex -s +'1,/UNIX/d|%p|q!' file_or_/dev/stdin

在哪里:

  • 1,/UNIX/d-匹配后删除文本
  • %p- 打印缓冲区
  • q!- 退出而不保存对文件的更改(用于wq就地编辑)

相关内容