4.17 打印文件中某个样式之前或之后的n行
在文本处理中经常需要打印由样式匹配的某个文本区域。有时候,我们也许会需要位于样式之前或之后的若干行文本。例如有一个文件包含了电影演员的评级情况,文件中的每一行都对应一位电影演员的详细信息,而我们需要从中找出某位演员的评级以及最接近这位演员的其他演员的详细信息。来看看如何实现这个需求。
4.17.1 预备知识
grep
是在文件中搜索文本的最佳工具。通常,grep
会打印出匹配给定样式的文本行或文本。不过grep
的前后行(context line)控制选项使它可以打印出位于样式匹配行之前、之后的或者同时包含前后的文本行。
4.17.2 实战演练
这个技巧最好通过一个电影演员名单来讲解。例如:
- $ cat actress_rankings.txt | head -n 20
- 1 Keira Knightley
- 2 Natalie Portman
- 3 Monica Bellucci
- 4 Bonnie Hunt
- 5 Cameron Diaz
- 6 Annie Potts
- 7 Liv Tyler
- 8 Julie Andrews
- 9 Lindsay Lohan
- 10 Catherine Zeta-Jones
- 11 CateBlanchett
- 12 Sarah Michelle Gellar
- 13 Carrie Fisher
- 14 Shannon Elizabeth
- 15 Julia Roberts
- 16 Sally Field
- 17 TéaLeoni
- 18 Kirsten Dunst
- 19 Rene Russo
- 20 JadaPinkett
要打印出匹配“Cameron Diaz
”的文本行及其之后的3行,使用下面的命令:
- $ grep -A 3 "Cameron Diaz" actress_rankings.txt
- 5 Cameron Diaz
- 6 Annie Potts
- 7 Liv Tyler
- 8 Julie Andrews
要打印出匹配行及其之前的3行,使用下面的命令:
- $ grep -B 3 "Cameron Diaz" actress_rankings.txt
- 2 Natalie Portman
- 3 Monica Bellucci
- 4 Bonnie Hunt
- 5 Cameron Diaz
打印出匹配行及其之前的2行和之后的2行,使用下面的命令:
- $ grep -C 2 "Cameron Diaz" actress_rankings.txt
- 3 Monica Bellucci
- 4 Bonnie Hunt
- 5 Cameron Diaz
- 6 Annie Potts
- 7 Liv Tyler
你是否还在想我是从哪里搞到这些评级信息的?
我可是曾经只用基本的sed
、awk
和grep
命令就解析了一个包含大量图片和HTML内容的网站。详情请参阅第5章。
4.17.3 参考
4.3节讲解了grep
命令。