找到一些文本后如何读取一定数量的行?
例如。:
在以下位置找到“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
。在看到 之前
UNIX
,i
没有定义,并且从 后的第 3 行开始UNIX
,i
其值大于 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
就地编辑)