4.17 打印文件中某个样式之前或之后的n行

在文本处理中经常需要打印由样式匹配的某个文本区域。有时候,我们也许会需要位于样式之前或之后的若干行文本。例如有一个文件包含了电影演员的评级情况,文件中的每一行都对应一位电影演员的详细信息,而我们需要从中找出某位演员的评级以及最接近这位演员的其他演员的详细信息。来看看如何实现这个需求。

4.17.1 预备知识

grep是在文件中搜索文本的最佳工具。通常,grep会打印出匹配给定样式的文本行或文本。不过grep的前后行(context line)控制选项使它可以打印出位于样式匹配行之前、之后的或者同时包含前后的文本行。

4.17.2 实战演练

这个技巧最好通过一个电影演员名单来讲解。例如:

  1. $ cat actress_rankings.txt | head -n 20
  2. 1 Keira Knightley
  3. 2 Natalie Portman
  4. 3 Monica Bellucci
  5. 4 Bonnie Hunt
  6. 5 Cameron Diaz
  7. 6 Annie Potts
  8. 7 Liv Tyler
  9. 8 Julie Andrews
  10. 9 Lindsay Lohan
  11. 10 Catherine Zeta-Jones
  12. 11 CateBlanchett
  13. 12 Sarah Michelle Gellar
  14. 13 Carrie Fisher
  15. 14 Shannon Elizabeth
  16. 15 Julia Roberts
  17. 16 Sally Field
  18. 17 TéaLeoni
  19. 18 Kirsten Dunst
  20. 19 Rene Russo
  21. 20 JadaPinkett

要打印出匹配“Cameron Diaz”的文本行及其之后的3行,使用下面的命令:

  1. $ grep -A 3 "Cameron Diaz" actress_rankings.txt
  2. 5 Cameron Diaz
  3. 6 Annie Potts
  4. 7 Liv Tyler
  5. 8 Julie Andrews

要打印出匹配行及其之前的3行,使用下面的命令:

  1. $ grep -B 3 "Cameron Diaz" actress_rankings.txt
  2. 2 Natalie Portman
  3. 3 Monica Bellucci
  4. 4 Bonnie Hunt
  5. 5 Cameron Diaz

打印出匹配行及其之前的2行和之后的2行,使用下面的命令:

  1. $ grep -C 2 "Cameron Diaz" actress_rankings.txt
  2. 3 Monica Bellucci
  3. 4 Bonnie Hunt
  4. 5 Cameron Diaz
  5. 6 Annie Potts
  6. 7 Liv Tyler

你是否还在想我是从哪里搞到这些评级信息的?

我可是曾经只用基本的sedawkgrep命令就解析了一个包含大量图片和HTML内容的网站。详情请参阅第5章。

4.17.3 参考

4.3节讲解了grep命令。