Answers:
一种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未定义,并从之后的第三行开始UNIX,i具有大于2的值,这使表达式i && i++ <= 2评估为false,导致awk什么也不做。
$答案开头的符号是shell提示符,而不是awk命令的一部分。
awk '/^UNIX$/ {s=NR;next} s && NR<=s+2'
一个grep解决方案:
grep -A2 -P '^UNIX$' file
说明: -A表示:在比赛后打印接下来的两行
要么 awk:
awk '$0=="UNIX"{getline; print; getline; print}' file
说明:该语句在($0=="UNIX")行中搜索UNIX 。如果给出了该值,它将获取下一个到其缓冲区(getline)并打印缓冲区(print)。这完成了两次。
或使用sed:
sed -n '/^UNIX$/{n;p;n;p}' file
说明:该类适用于UNIX(/^UNIX$/)。如果找到,它将在中执行该部分{...}。n表示下一个,p表示打印。这也完成了两次。
getline; print;的部分awk语句或n;p;在部分sed语句。
grep -A100 -P '^UNIX$' file | tail -n +2。尾部是除去第一留置权。在其他(sed,awk)中,您将不得不编写循环,这使其变得不那么简单。
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.
UNIX在输出中打印。
UNIX,管它tail: [...] | tail -n +1,或sed:[...] | sed '1d'。
tail和的sed '1d'建议才能正常工作UNIX。所有其他答案都允许多次出现。建议可能会更好... | grep -v UNIX。诚然,如果UNIX出现在第15和第17行上,这会变得很混乱
sed使用某种形式的来完成此操作sed '/UNIX/d;n;n;p/' /path/to/file,我只是将其保留下来并作为答案提交。
这似乎很好地解决了问题:
sed -n '/UNIX/{n;p;n;p}' /path/to/file
概念证明:
$ for i in {1..9}; do echo $i; done | sed -n '/4/{n;p;n;p}'
5
6
for循环周围的子外壳不是必需的。