9.15 在搜索结果中进行搜索

grep | grep

如果要列出John Coltrane在其音乐生涯最后两年发行的专辑,该怎么办呢?非常简单。如下所示:

  1. $ ls -1 | grep 196[6-7]
  2. 1966_Live_at_the_Village_Vanguard_Again!
  3. 1966_Live_in_Japan
  4. 1967_Expression
  5. 1967_Olatunji_Concert_Last_Live_Recording
  6. 1967_Stellar_Regions

如果将范围设置为[5-7],结果会得到比1966到1967年更长的列表。到目前为止,一切顺利,但如果不想包括任何演唱会专辑,又该怎么办呢(这通常是一个可怕的错误,但我们这里只是假设有这样的需求)?解决办法如下所示:

  1. $ ls -1 | grep 196[6-7] | grep -v Live
  2. 1967_Expression
  3. 1967_Stellar_Regions

-v选项(在9.13节中介绍过)用于剔除包含Live的行,但这里真正有趣的地方是:如何提取ls -1的输出,再把它通过管道传递给grep 196[6-7],然后再把来自过滤器的输出通过管道传给第二个grep命令实例,正是由这个实例来使用-v Live。最终得到的就是想要的结果:所有在1966年到1967年之间发行的John Coltrane的专辑,而且在标题中没有包含Live。朋友们,从这种简单的方式中看到Linux命令行的强大威力了吧!