在许多环境中,我已成功使用此实用程序多年。但我注意到在一个特定的环境中,它会产生非常意外的结果。
grep -r 'search-term1' . | grep 'search-term2'
上面的代码在current-dir中针对search-term1的所有实例递归greps。然后将结果传送到另一个grep,它只选择那些也包含search-term2的行。这完全符合我的预期。
grep -r 'search-term1' . | grep -r 'search-term2'
上述代码的唯一区别是两个grep命令中指定的-r递归标志。我希望这种特殊情况不会改变行为。毕竟,第二个grep的输入是一个管道输入,并且没有任何进一步的递归。
多年来,我一直在许多不同的环境(unix和mac-os)中成功使用该命令。但是,我开始工作的最新环境(unix)打破了上述行为。第二个管道grep搜索search-term2的所有实例,不仅在管道输入中,还在当前目录中的所有文件中。因此,我得到的结果只包含第二个搜索词,而不是只获得包含搜索词的搜索结果。
为什么这个特定的环境会产生这种奇怪的行为?有什么方法可以避免这种情况,同时仍保留-r标志吗?
常见问题:
问:为什么我在管道输入上使用-r标志?
Ans:我实际上将grep保存为别名,我总是希望将许多不同的选项和标志用作默认值。递归标志就是其中之一。我想总是使用这个别名,而不是每次都输入所有的标志。
问:如果您要搜索与两个搜索字词匹配的所有实例,为什么不这样做(insert-superior-method-here)呢?
答:你可能是对的。我确信有些事情我可以改变我的惯常习惯来解决这个问题。然而,作为求知欲,我想找出为什么递归-greps-on-pipes在大多数环境中按预期工作,但不是全部,如果可以以某种方式解决。答案 0 :(得分:4)
在grep版本2.11(release notes中更改了grep的-r
标志,如果没有给出文件参数,则隐式使用工作目录作为输入。
如果没有给出文件操作数,则命令行为-r或等效命令 给出了选项,grep现在搜索工作目录。
您没有给出第二个grep
任何文件参数,因此尽管存在管道输入,它仍默认为当前目录。
尝试grep -r 'search-term1' . | grep -r 'search-term2' -
作为解决方法。
grep -r 'search-term1' . | grep -r -d skip 'search-term2'
也可以解决问题。