找到一些文本后如何阅读一定数量的行?
例如。:
在以下位置找到“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。
在看到之前UNIX,i没有定义并从 3rd line 开始UNIX,i有一个大于 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)